2011-05-20 12 views
10

İşte meydan okuma: Ben bir JS fonksiyonunda geri arama için/mağaza tespit edebilmek istiyorum bilinmeyen bir DOM kimliğini kullanarak bir sayfa gömülecek Flash film var.Bir JavaScript işlevi hangi Flash DOM nesnesinin onu aradığını tespit edebilir mi?

Benim ideal kullanıcı akışı olacaktır:

  1. Kullanıcı Flash düğmesini tıklar.
  2. Flash, herhangi bir animasyonu/videoyu/sesi/vb. Duraklatır
  3. Flash, sayfa kaplaması yer paylaşımı deneyimini görüntülemek için enjekte edilmiş bir JS işlevini çağırır. Kullanıcı bindirme deneyim kapattığında
  4. Flash nesne üzerinde bir geri arama yöntemi olarak adlandırılır.
  5. Flash oynatmaya devam ediyor.

sorun AS3 ("functionName", args ...) yöntemini ExternalInterface.call kullandığında, orada bir DOM olayı tetiklenir gibi görünüyor ve böylece bunu söylemek mümkün değildir gelmez, hangi nesne JS işlevi denir, böylece "registerMe()" işlevine sahip çalışmak işe yaramıyor. Temel olarak, enjekte edilen JS işlevinin hangi DOM nesnesinin çağrılacağını belirlemesinin bir yolu yoktur, çünkü Flash nesnesinin kimliği bilinmemektedir.

[UPDATE] Bu bir SWF, loaderInfo.url kullanarak kendi URL'sini belirleyebilir. Bu bilgiyi, tüm uygulama/x-shockwave-flash DOM nesnelerine karşı gelecekteki bir karşılaştırma için saklanabilmesi için bindirme deneyimini başlatan komut dosyasına aktarıyorum. Bir eşleşme bulunduğunda, bu arayan SWF'dir. Bu mantıkta bir kusur gören var mı? (Ben AS ile olduğu kadar JS ile neredeyse yetkin değilim)

+2

Bazen Flash ve JS'nin birlikte çalışmasını sağlamakla ilgili kabuslar görüyorum. – sdleihssirhc

+0

Her zaman, sayfadaki tüm SWF'leri bulma ve her birinde geri arama işlevini denemenin kaba kuvvet tekniği vardır, ancak bu beni riskli ve sorumsuz olarak vurur, bu yüzden masa üstünde değildir. –

+0

swf'nin kontrolü sizde var mı? –

cevap

5

JavaScript işlevi olmayan bir olay olarak, elle çağrıldığını olduğunu. JS'de call veya apply yöntemlerini kullandıysanız. Bununla

ExternalInterface.call('functionName', arg1, arg2, ..., ExternalInterface.objectID); 

biri "yakaladım": Bu geri başvurmak için hangi DOM öğesi bilir böylece olduğu, aradığınız işleve parametre olarak DOM name/ID of the active flash video geçmesi yapabilirim ne

yöntem ExternalInterface.objectID tarayıcılarda tutarsız kayıtlı olacak çünkü object ve/veya embed elemanları hem [id] ve [name] nitelikleri ayarlamak olduğundan emin olmak için ihtiyaç vardır.Yanlış hatırlamıyorsam,

IE Bir kaç tarayıcılar [name] başarıyla özelliklerden kaçınarak olacağına inanıyorum rağmen [name] ve ff/krom/opera/safari, [id] okumak okur. Bunu doğrulamak için bir test yapmam gerekecek.

Her durumda, an identical name and id verin ve iyi çalışmalı (yalnızca DOM'a göre öğeyi DOM'dan seçebileceksiniz).

2

Burada tüm gömme işlemi üzerinde tam kontrol sahibi olduğunuzu varsaydığımdan beri, SWF'ye bir Flashvar olarak DOM kimliğini anlatabiliyormuşsunuz gibi geliyor. gömülü olduğu gibi (ister SWFObject gibi Javascript aracılığıyla olsun, isterse sunucu HTML'yi oluşturuyor olsun). Ardından, arabirimi tetiklemek için Javascript işlevini çağırdığında, DOM kimliğini bir argüman olarak gönderebilir.

pek ideal, ama kesinlikle uygulanabilir ve tarayıcıda kolay değil.

+0

Ne yazık ki, SWF'nin dağıtımını kontrol etmiyoruz ... birkaç farklı reklam ağında olacak ve swf'yi yüklediğimizde belirlediğimiz herhangi bir parametrenin, vahşi doğduğunda geçerli olacağını garanti etmiyoruz. –

0

ben yapabilirsiniz sanmıyorum. Düşünebildiğim tek “temiz” yol, Flash nesnesi aracılığıyla Flash nesnesinin kimliğini enjekte etmektir. Çirkin bir şekilde tüm Flash nesnelerini bulmak ve doğru Flash nesnesini karşılaştırmak ve tanımlamak için loaderInfo.url kullanın. Aradığınız

+0

Ne yazık ki, Flash parçasının senaryosu, çeşitli reklam ağları üzerinden sunulmakta ve dolayısıyla tutarlı bir kimliği olmayacaktır. –

İlgili konular