IE

2010-01-20 44 views
10

içinde jQuery tarafından ayarlanan iframe `name` özniteliğinin garip davranışı Bir dosyayı bir iframe'e göndererek bir ajax stili dosya yükleme yapıyorum ve IE'de bazı garip davranışlar fark ettim (hem de 6 & içinde olduğu anlaşılıyor 8). Temel olarak IE'de form target iframe'i düzgün bir şekilde göstermez, böylece yanıt yeni bir pencerede görünür (iframe yerine). HTML/JS verilen sırada kümesiyle sorunu yeniden edebilirsiniz:IE

Şimdi
<html> 
<head> 
    <script src="http://code.jquery.com/jquery-1.3.2.js"></script> 
    <script> 
    $(document).ready(function(){ 
     var frameName = "myFrame"; 
     var $iframe = $("<iframe src=\"about:blank\" />") 
       .attr("name", frameName) 
       .appendTo("body"); 
     var $uploadForm = $("<form action=\"http://www.google.com/search\" />") 
       .attr("target", frameName) 
       .append("<input type=\"text\" name=\"q\" />") 
       .append("<input type=\"submit\" />") 
       .appendTo("body"); 
    }); 
    </script> 
</head> 
<body> 
</body> 
</html> 

(bir cevap göndermeden önce), bazı soruşturma (IE8'ın geliştirici araçlarını kullanarak) yaptım ve .attr("name", frameName) aslında ekleyerek anlaşılıyor sadece yerine submitName="myFrame" özniteliği. Buna dayanarak, ben biraz nastier iframe oluşturma kodu değiştirerek sorunu çözüldü: istendiği gibi

var $iframe = $("<iframe src=\"about:blank\" name=\"" + frameName + "\" />") 
     .appendTo("body"); 

Bu değişikliği yapmak, iframe içine formu yazısı yapar. Neden .attr("name", ...) eser

  • beklenen yok gibi:

    Sorularım nelerdir?

  • JQuery'de bir hata mı, IE'deki bir hata mı (elbette değil!?!), Yoksa belirgin bir şey eksik miyim?
  • submitName özniteliği nereden geliyor & Amacı nedir?

cevap

16

IE bir hata

ancak (kesinlikle değil!?!): Eğer o pis bulursanız

, bu deneyin .

Tarihsel olarak (*), name özniteliğinin ayarlanması IE'de birçok sorunla karşılaşır. Sadece kısmen tutmaya eğilimlidir. Örneğin, form alanı adları üzerinde olması gerektiği gibi form.elements[name] aramayı etkilemez. Bu, name özelliğinin ayarının güvenilir olmadığı başka bir durum gibi görünüyor.

jQuery, tarayıcı hataları çevresinde bu şekilde çalışmayı denerken, her şeyi yakalamaz ve tam olarak çözmenin bilinen bir yolu yoktur.

(*: IE'de 7'ye kadar) Standart mod doctype'ı kullanarak bir yerel belge Modunda IE8 çalıştırırsanız ve gerekirse bir X-UA-Uyumlu üstbilgi/meta varsa, bu iki hata da kesilmez.)

Dev araçlarda görünen submitName, bir IE hatasının sahnelerinin arkasındaki ilginç bir bakış açısıdır, çünkü bu, herkes tarafından görülebilen DOM'de görünmüyor. Bir <input> öğeye veyaözniteliği de oluşturulduktan sonra yazıldığı <form>'a bakarsanız, aynı şeyi yapar.

Peki oluyor gibi görünüyor IE-up-to-7 form alanları için o saha parçası olarak üretecektir veri değiştirir, içten submitName denilen bir başka-görünmez özelliğine name denilen nitelikler, tüm kullanımını yönlendirir olmasıdır bir form gönderimi, ancak HTMLCollection endeksleme, radyo gruplandırma, getElementsByName veya [i] kareleri durumunda hedefleme için kullanılan gerçek name özniteliğini değiştirmez.

+0

Arka plan için teşekkürler, bu bir ex-IE geliştiricileri gönderme (ben aslında gerçeğini kabul hayal edemesem de, P), ben almak için gidiyorum gibi bir cevap olarak düşünüyorum, bu yüzden kabul ediyorum o. Doğru doktrininiz varsa en azından hatanın gerçekten IE8'de kaybolduğunu bilmek güzel. – Alconja

+0

'getElementsByName', radyo gruplaması ve benzeri, 'name' öznitelikleri aynı kalsa ve yalnızca 'submitName'' öznitelikleri değişse bile çalışıyor gibi görünüyor - bahsettiğiniz şeylerle ilgili herhangi bir sorun yaşadınız mı? Bunu ie8'de ie7 uyumluluk modunda test ettim ve her şey işe yaradı. – cic

+0

Bazı bilgi: http://thunderguy.com/semicolon/2005/05/23/setting-the-name-attribute-in-internet-explorer/ – cic

0

jQuery 1.4 içinde markup creation improvements gördünüz mü? biz orada, biliyorum inanmak zor

$('<iframe />', 
{ 
    name: frameName, 
    src: 'about:blank' 
}).appendTo("body"); 
+0

Fark yaratmaz: yeni '{attrs}' nesnesinden 'name 'ayarı' attr()' kullanılarak ayarlanmasında olduğu gibi başarısız olur. – bobince

+0

Utanç, yine de, biçimlendirme geliştirmeleri gösterilmeyi hak ediyor. +1 bobince –

+0

Evet Yeni sözdizimini gördüm (bu proje için 1.3.2 ile takılı kaldım), ama bu aslında soruyu cevaplamıyor ... Sorun hala yeni sözdizimini ve 1,4'ü kullanıyor. yazdı etkin olarak orijinal '.attr (" name ", frameName)') ile eşdeğerdir. – Alconja

2

Yalnızca bir jQuery sorunu değil, el ile ayarlandığında, bu da olur.

Ayarlamak için setAttribute() yöntemini kullanırsanız, jQuery olmasa bile, form veya iframe yeni oluşturulduğunda aynı şeyi yapar! aynı şekilde, düzeltebilirim innerHTML kullanarak ... evet, bir kez daha, Microsoft Günümü yok ediyor: Bu

$("<iframe name='frameName' />") 

gibi eleman oluşturma/

4

benim için sorun çözüldü