2013-09-16 4 views
2

В настоящее время я использую бесконечную прокрутку для загрузки большего содержимого, содержимое содержит <script> теги, которые необходимо запустить. Поэтому я использую этот код как ajax-callback:после завершения ajax, загрузите теги <script>, но только те, у которых определенный идентификатор

JS от нагрузки АЯКС обратного вызова:

function ajaxLoadedCallback() { 
     // contentElem is the HTML element you've loaded via ajax 
     scriptx = document.getElementsByTagName("script"); 

     // Load scripts into new array because 
     // scriptx seems to change as scripts execute, at least in some browsers 
    scripts = new Array(); 
    for (var idx=0; idx<scriptx.length; idx++) { 

     if (jQuery(scriptx[idx]).is("#inline-comments")) { 
       scripts[idx] = scriptx[idx].text; 
     } 

    } 

     console.log (scripts[idx]); 
     // execute each script in turn 
     for(idx=0; idx<scripts.length; ++idx) { 
     if (scripts[idx].length!=0) { 
      try { 
       // create a function for the script & execute it 
       f = new Function(scripts[idx]); 
       f(); 
      } catch(se) { 

      } // end try-catch 
     } // end if 
     } // end for 

} 

Каждое содержание пост имеет этот сценарий тег, я хочу, чтобы загрузить:

<script id="inline-comments" > 
    console.log ('<?php echo $post->ID; ?>' + 'has loaded...'); 
    var tid_<?php echo $post->ID; ?> = setInterval(function() { 
    if (document.readyState !== 'complete') return; 
     clearInterval(tid_<?php echo $post->ID; ?>);  
     inline_comments_ajax_load(<?php echo $post->ID; ?>) 
    }, 100); 
</script> 

Получение Uncaught TypeError: не удается прочитать длину свойства неопределенной ошибки в этой строке: if (scripts[idx].length!=0) {

ajax переводит нагрузки в нужное время, но ломается, потому что я предполагаю, что scripts[idx] пуст. но почему? когда я использую console.log(), он показывает, когда scriptx[idx] имеет идентификатор и имя идентификатора.

ОБНОВЛЕНИЕ Спасибо PSL! console.log показывает, что он найти сценарии, но scripts.length возвращается ноль

function ajaxLoadedCallback() { 
    scriptx = document.getElementsByTagName("script"); 


    scripts = new Array(); 
    for (var idx=0; idx<scriptx.length; idx++) { 

     if (jQuery(scriptx[idx]).is(".inline-comments-script")) { 
      console.log (".inline-comments-scriptfound!"); 
      console.log ("####### .text #######"); 
      console.log (scriptx[idx].text); 
      console.log ("####### .innerHTML ######"); 
      console.log (scriptx[idx].innerHTML); 
      scripts.push = scriptx[idx].innerHTML; 
     } 

    } 
    console.log ("####### END ######"); 
    console.log ("Found "+scripts.length+ " script(s)"); 

     // execute each script in turn 
     for(idx=0; idx<scripts.length; ++idx) { 
     var content = scripts[idx]; 
      if (content.length) { 
       try { 
       // create a function for the script & execute it 
       f = new Function(content); 
       f(); 
      } catch(se) { 

      } // end try-catch 
     } // end if 
     } // end for 

} 

теперь работает! См. Ответ PSL ниже - вы также можете увидеть его вживую, если у вас есть wordpress: https://github.com/MattMcFarland/inline-ajax-comments - отлично работает!

+0

Вместо перебирает все элементы сценария использовать 'document.getElementById ('инлайн-комментарии');' – jantimon

+0

Пробовал, что не работал – docodemore

+0

Изменить 'scripts.push = ScriptX [IDX] .innerHTML,' 'для скриптов .push (scriptx [idx] .innerHTML); 'см. мой ответ для синтаксиса ... – PSL

ответ

3

У вас есть пара вопросов здесь.

for (var idx=0; idx<scriptx.length; idx++) { 

     if (jQuery(scriptx[idx]).is("#inline-comments")) { 
       scripts[idx] = scriptx[idx].text; 
     } 

    } 

Вы приращение переменной итерации цикла Eventhough нет никакого матча и вы не хотите, чтобы нажать любой элемент в массив. Таким образом, если первый сценарий не совпадает с условием scripts[0] будет неопределенным, следовательно, вы получите сообщение об ошибке, когда вы Tru к Acces свойство length неопределенных в вашем состоянии if (scripts[idx].length!=0) {

Другая проблема заключается в том, что scriptx[idx].text здесь текст является функция, так что вы хотите реальный текст элемента, а не ссылку на функцию, поэтому вы должны написать jQuery(scriptx[idx]).text() или scriptx[idx].innerHTML. Так как вы используете идентификатор и идентификаторы не должны быть дублированы, вы можете просто написать это как:

 var txt = jQuery('#inline-comments').text(); 
    if (txt.length) { 
     try { 
      // create a function for the script & execute it 
      f = new Function(scripts[idx]); 
      f(); 
     } catch(se) { 

     } // end try-catch 
    } // end if 

Если вы планируете превратить inline-comments в класс с идентификатором, и вы хотите получить доступ к нескольким из них, то это должно работать ,

scripts = []; 
    for (var idx=0; idx<scriptx.length; idx++) { 
     if (jQuery(scriptx[idx]).is(".inline-comments")) { 
       scripts.push(scriptx[idx].innerHTML); 
     } 
    } 
    // execute each script in turn 
     for(idx=0; idx<scripts.length; ++idx) { 
      var content = scripts[idx]; 
     if (content.length) { 
      try { 
       // create a function for the script & execute it 
       f = new Function(content); 
       f(); 
      } catch(se) { 

      } // end try-catch 
     } // end if 
     } // end for 
+0

Спасибо за ваш чрезвычайно проницательный пост !!!!!!: – docodemore

+0

scripts.length возвращает ноль, вы можете видеть, я отредактировал мой пост и поместите console.log, он правильно найдет скрипты (я переименовал id, сделав его классом), но почему это сценарий.length zero? – docodemore

+1

@ MatthewA.McFarland Да, ваш синтаксис для нажатия на массив неверен. Попробуйте 'scripts.push (scriptx [idx] .innerHTML)' – PSL

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