2012-02-20 20 views
11

Bir sayfada iframe'im var. Bu iframe'de, sıralanabilir olması gereken öğelerden oluşan bir koleksiyon. Javascript'in tamamı ana sayfada çalıştırılıyor. Ben bağlamını kullanarak sıralanabilir iframe belgede listesine erişmek ve oluşturabilirsiniz: aslında öğeleri sıralamak için çalışırkeniframe'de jQuery UI oluşturulabilir

var ifrDoc = $('#iframe').contents(); 

$('.sortable', ifrDoc).sortable({ cursor: 'move' }); 

Ancak, bazı anormal davranış alıyorum. Bir öğe tıklandığında, komut dosyasının hedefi dış belgeye geçer. Iframe'i farenin dışına taşırsanız, öğeyi hareket ettirebilir ve tıklayarak geri bırakabilirsiniz, ancak iframe içinde bununla etkileşime giremezsiniz.

Örnek: http://robertadamray.com/sortable-test.html

Yani, yapmak istediğim ulaşmak için bir yol yoktur - tercihen jQuery UI kodunda etrafında hack gitmek zorunda kalmadan?

cevap

9

iframe (demo) jQuery ve jQuery UI ekleyin:

$('iframe') 
    .load(function() { 
     var win = this.contentWindow, 
      doc = win.document, 
      body = doc.body, 
      jQueryLoaded = false, 
      jQuery; 

     function loadJQueryUI() { 
      body.removeChild(jQuery); 
      jQuery = null; 

      win.jQuery.ajax({ 
       url: 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js', 
       dataType: 'script', 
       cache: true, 
       success: function() { 
        win.jQuery('.sortable').sortable({ cursor: 'move' }); 
       } 
      }); 
     } 

     jQuery = doc.createElement('script'); 

     // based on https://gist.github.com/getify/603980 
     jQuery.onload = jQuery.onreadystatechange = function() { 
      if ((jQuery.readyState && jQuery.readyState !== 'complete' && jQuery.readyState !== 'loaded') || jQueryLoaded) { 
       return false; 
      } 
      jQuery.onload = jQuery.onreadystatechange = null; 
      jQueryLoaded = true; 
      loadJQueryUI(); 
     }; 

     jQuery.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'; 
     body.appendChild(jQuery); 
    }) 
    .prop('src', 'iframe-test.html'); 

Güncelleme: jQuery UI tutan ve jQuery UI oldu sayfanın window ve document başvurular kullanırAndrew Ingram is correct yüklendi. JQuery/jQuery UI öğesini iframe'e yükleyerek, doğru referanslara (dış belgeden ziyade iframe için) sahiptir ve beklendiği gibi çalışır.Güncelleme 2


: orijinal kod parçacığı ince bir sorunu vardı: dinamik script etiketleri yürütme sırası garanti edilmez. JQuery hazır olduğunda jQuery UI'nin yüklenmesini sağladım.

Ayrıca gety'nin kodunu load LABjs dynamically'a ekledim, böylece yoklama gerekli değildir. Bunun yerine yükleme jQuery ve jQueryUI iFrame içinde ve ebeveyn ve çocuk hem jQueryUI etkileşimlerini değerlendirmek

+0

Teşekkürler! Bu bana yeterince temiz bir çözüm gibi görünüyor. Bu sorunun neden giderildiğine dair bir açıklama veya bir bağlantı ekleyebilir misiniz? – RARay

+0

@RARay Lütfen güncellememi inceleyin. –

+0

"Bu bana yeterince temiz bir çözüm gibi görünüyor." Gerçekten mi? Bu düz yukarı yoklama. Üretim için korkunç bir çözüm. Bundan daha iyi bir yol olması için * vardır. – kamelkev

3

Kodunuzun neden çalışmadığını bilmiyorum. Olması gerektiği gibi görünüyor. sözü

, burada bu özelliği uygulamak için iki alternatif yolu vardır:

  1. Eğer iframe-test.html içine ana belgeden JavaScript'inizi Taşı iframe

    değiştirebilirsiniz edin. Bu en temiz yol olabilir, çünkü JavaScript'i gerçekte üzerinde çalıştığı öğelerle birleştirir.

  2. sadece içerik yerine HTML iframe almak için ana belgeyi

    Kullanım jQuery .Load() yöntemini kontrol ederse

    http://dl.dropbox.com/u/3287783/snippets/rarayiframe/sortable-test.html.

    http://dl.dropbox.com/u/3287783/snippets/rarayiframe2/sortable-test.html

+0

Tabii ki, ama bu benim kullanım durumum değil. Sadece ana belgeyi kontrol ediyorum. – RARay

+0

İyi nokta. Cevabımı, bunu uygulamak için ikinci bir yolla güncelledim. Soruyu yanıtlamıyor olsa bile, sizin için işe yarayabilir. –

+0

Bu gerçekten ilginç bir nokta ve benim düşünmediğim bir şey. Soruyu doğuran daha karmaşık bir sistem için çalışıp çalışmayacağını bilmiyorum, ama kesinlikle ona bir göz atacağım. Teşekkürler! – RARay

5

onların javascript biraz Kampanya Monitör temelde jQuery UI özel bir sürümünü alarak bu çözer ile üstlendiğinden. Belge ve pencereye yapılan başvuruları, söz konusu öğe için belgeyi ve pencereyi alan kodla değiştirmek için ui.mouse ve ui.sortable öğelerini değiştirdiler. document

this.element[0].ownerDocument olur ve onları this.element.window() veya benzeri ile window yerine sağlar özel bir jQuery işlevi denir pencere() var. Dinamik

+0

Şimdi bunu nasıl ele alıyoruz. Temel olarak, gerekli işlevleri çalıştıracak bir kod ile genişleten bir eklenti yazdım. Bu hacky ve korkarım, durumumuza özgü. Bu sorunun çözülmesine izin verecek bir kaynağa bağlantı sağlayabiliyor musunuz? – RARay

+0

Hey Andrew, özel jQuery dosyasının bağlantısını gönderir misiniz? –

+0

Hey Andrew, bunun için bir link gönderebilir misin, bence bu yaklaşımla hastalanacağım. ya da belki bir rehber. –

1

- yapabilirsiniz basitçe kabarcık ebeveynin belgeye fare olaylar:

var ifrDoc = $('#iframe').contents(); 

$('.sortable', ifrDoc).on('mousemove mouseup', function (event) { 
    $(parent.document).trigger(event); 
}); 

tüm Javascript değerlendirmek Bu şekilde Ebeveynin belge bağlamında.