jQuery.fn.load呼び出し時にurlにselectorを付けてスクリプトを実行する方法


jQueryを呼び出すfn.loadではurlの後ろにセレクタを付けてロードされたコンテンツを指定できます.ドキュメントには次のように記述されています.
デフォルトではGET方式-追加パラメータを渡すと自動的にPOST方式に変換されます.jQuery 1.2では、読み込まれたHTMLドキュメントをフィルタするためのセレクタを指定でき、DOMではフィルタされたHTMLコードのみが挿入されます.「url#some>selector」などの構文.例を参照してください.

      
      
      
      
  1. $("#links").load("/Main_Page #p-Getting-Started li"); 

ただし、セレクタが指定されているとページ内のスクリプトが実行されないという問題があり、jQueryのコードを見てみると、セレクタがあったときに、すべてのスクリプトをフィルタリングしていたことがわかります
jQuery 1.8.3ソースコードの2つのセグメント:

      
      
      
      
  1. rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, //   

      
      
      
      
  1. // See if a selector was specified 
  2. self.html( selector ?
  3.   
  4.     // Create a dummy div to hold the results 
  5.     jQuery("<div>") 
  6.  
  7.         // inject the contents of the document in, removing the scripts 
  8.         // to avoid any 'Permission Denied' errors in IE 
  9.         .append( responseText.replace( rscript, "" ) ) 
  10.  
  11.         // Locate the specified elements 
  12.         .find( selector ) : 
  13.  
  14.     // If not, just inject the full result 
  15.     responseText ); 
では、ページ内のスクリプトを実行するには、ページ内容のスクリプトを見つけてもう一度実行するだけです.loadのcallbackでは、ページ全体を取り出すことができるので、一言で解決できます.

  
  
  
  
  1. $("#place_holder").load("Page.html #content"function(html) { 
  2.     //  html , css script  
  3.     //  DIV ( , remove) 
  4.     $("<div>").html(html).remove(); 
  5. }); 

しかし、jQueryがスクリプトをフィルタリングするのは理にかなっている以上......htmlのcssやscriptの一部が呼び出したくない可能性があるので、どうすればいいのでしょうか.jQueryでscriptをフィルタリングするのと似たような方法で、すべてのscriptを探し出して、実行する必要があるものを選んで実行します.
すると、scriptに属性loadinvoke=「true」を追加すると、コンテンツがロードされた後に実行されることが約束されています.

  
  
  
  
  1. <script type="text/javascript"> 
  2.     console.log(" jQuery.fn.load ") 
  3. </script> 
  4.  
  5. <script type="text/javascript" loadinvoke="loadinvoke"> 
  6.     console.log(" jQuery.fn.load ") 
  7. </script> 

ロードされたスクリプトに材料を追加するには、次の手順に従います.

  
  
  
  
  1. rscript = /<script\b[^>]*\b loadinvoke \b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi; 
  2.  
  3. $("#place_holder").load("Page.html #content"function(html) { 
  4.     //   
  5.     var m = html.match(rscript); 
  6.     for (var i = 0; i < m.length; i++) { 
  7.         //  div  
  8.         $("<div>").html(m[i]).remove(); 
  9.     } 
  10. }); 

れんがを投げて玉を引く