2013-02-19 3 views
0

im пытается найти мою страницу для iframe, у которой нет атрибута 'current', установленного как 'current'.Почему мой if/else не работает

(текущий атрибут устанавливается, когда используется iframe, и сбрасывается после его загрузки).

Я пытаюсь кода, так что если есть 1 или более Iframes не установлен в качестве текущего, используйте один из них, ELSE, создать новый IFRAME, сделать некоторые другие вещи и использовать новый,

но этот код не совсем работает, я никогда не запускаю «предупреждение», поэтому я никогда не вхожу в часть ELSE, хотя я знаю, что у меня нет фреймов, у которых «текущий» атрибут не установлен:

var $fi = $visible.find(".file-info"); 
     thisPreview = {}; 
     var iframes = $('iframe').filter(function (index) { 
       return index == 0 || $('iframe').attr("current") == "no"; 
       }) 
     if(iframes.length >0){ //if one of the iframes hasnt got current set as current, use it 
      var theSuffix = iframes.attr('id').split('_').pop(); 
      thisPreview[theSuffix] = $fi.prev(".image-preview"); 
      $(this).closest(".file-upload-form").children(".variable-hidden").attr('value',theSuffix); 
      iframes.attr('current','current'); 
      $(this).closest('.file-upload-form').attr('target','upload_target_'+theSuffix); 
     } 
     else{//else, create a new iframe, quick! 
      var count = $('[id^="upload_target_"]').length(); 
      alert(count); 
      var countPlus1 = count+1; 
      iframe = $('<frame>').attr({'id':'upload_target_'+countPlus1,'name':'upload_target_'+countPlus1,'current':'current'}).addClass('upload-target'); 
      iframe.appendTo($('#container')); 
      thisPreview[countPlus1] = $fi.prev(".image-preview"); 
      $(this).closest(".file-upload-form").children(".variable-hidden").attr('value',countPlus1); 
      $(this).closest('.file-upload-form').attr('target','upload_target_'+countPlus1); 

     } 
+0

Эта функция фильтра сверху выглядит подозрительной. Возможно, вы должны использовать '$ (this)' (выберите текущий элемент, который будет протестирован для фильтрации) вместо '$ ('iframe')' (выберите каждый iframe на странице). Еще лучше, просто используйте 'this.getAttribute ('current') == 'no'' – andytuba

ответ

3

index == 0 вернет true для первого iframe, независимо от того, имеет ли он этот атрибут или нет.

Также, $('iframe').attr("current") == "no"; выбирает все iframes. Вы хотите, чтобы текущий:

$(this).attr("current") == "no"; 

И, наконец, не составляйте свои собственные атрибуты. Используйте data- префикс:

<div data-stuff="foo"></div> 

и метод .data():

$('div').data('stuff') // "foo" 
0

Вы можете использовать Attribute Not Equal Selector

var iframes = $('iframe[current != "current"]') 
if (iframes.length > 0) { 
    // use old one 
} else { 
    // create new one 
} 

JSFiddle для тестирования.

+0

В качестве альтернативы используйте': not ([current = "current"]) 'для повышения производительности (за привязку docs @Olaf). – andytuba

0

Вы уверены, что этот код дает точные результаты?

return index == 0 || $('iframe').attr("current") == "no"; 

Я смущен использованием возврата. Будет ли он возвращать оценку «index == 0» или он будет оценивать «index == 0», если это значение false, тогда оцените «$ (« iframe »). Attr (« current ») ==« no »?? Я думаю, вы хотите, чтобы он делал последнее, но он кажется неоднозначным, и он может не дать вам ожидаемых результатов.

Смежные вопросы