讓javascript中用innerHMTL新增的指令碼執行起來(轉)
前幾日在網上查詢為什麼innerHTML把內容加到div中不能執行指令碼的原因時,發現網上給出的程式有些複雜。在讀完jquery的原始碼之後,根據jquery的方式,做了如下處理,並通過了ie、 firefox、google chrome 、opera的測試。
- 把載入回來的資料以innerHTML的方式放入到一個動態生成的Div中;
- 建立一個文件片段,把Div中的子元素都AppendChild到片段中;
- 選出文件片段中的Script節點;
- 把文件片段中的非Script節點新增到頁面;
- 如果此節點存在src屬性,那就再一次請求此src,並取回內容;如果此節點不存在src屬性, 那就把此節點的文字內容取回;
- 取出DOM中的Head節點,再建立一個Script節點,設定節點Type屬性為Text/javascript型別;
- 把第5步中取出的內容,新增到第6步建立的Script節點中,並把此節點插入為Head節點的第一個子節點;
- 刪除Head節點中在第7步插入的Script節點;
實現
- /**
- * 新增innerHTML到節點中
- * @param elem 節點
- * @param html HTMLCode
- */
- JS.innerHTML = function( elem , html ){
- /* 生成一個動態 */
- var dynDiv = document.createElement( 'div' );
- /* 把內容都新增到此div中 , 因為如果第一個節點為script時ie會忽略此節點,所以就要上面加一個新節點 */
- dynDiv.innerHTML = 'for ie'+html;
- /* 取出動態div中的script節點 */
- var scripts = dynDiv.getElementsByTagName('script');
- /* 取出head節點,再新生成的節點新增到head中 */
- var head = document.getElementsByTagName('head')[0];
- /* 把script中的指令碼或要引入的外部 指令碼 */
- for( var i=0;i
- var jsCode = '';
- /* 如果為外部指令碼,就再去載入資料 */
- if( scripts[i].src ){
- JS.ajax( {
- url : scripts[i].src,
- type : 'get',
- success : function( respon ){
- jsCode = respon.responseText;
- evalJs( jsCode );
- }
- } );
- /* 如果只是內部指令碼,就取出程式程式碼 */
- }else{
- jsCode = scripts[i].innerText || scripts[i].textContent || scripts[i].text || '';
- evalJs( jsCode );
- }
- }
- function evalJs( jsCode ){
- /* 新建一個script節點 */
- var scpt = document.createElement('script');
- scpt.type='text/javascript';
- scpt.text = jsCode;
- head.insertBefore( scpt ,head.firstChild );
- head.removeChild( scpt );
- }
- /* 刪除內容中的script節點 */
- for( var i=0;i
- if( scripts[0].parentNode ){
- scripts[0].parentNode.removeChild( scripts[0] );
- i--;
- }
- }
- elem.innerHTML = dynDiv.innerHTML;
- }
/** * 新增innerHTML到節點中 * @param elem 節點 * @param html HTMLCode */ JS.innerHTML = function( elem , html ){ /* 生成一個動態 */ var dynDiv = document.createElement( 'div' ); /* 把內容都新增到此div中 , 因為如果第一個節點為script時ie會忽略此節點,所以就要上面加一個新節點 */ dynDiv.innerHTML = ''+html; /* 取出動態div中的script節點 */ var scripts = dynDiv.getElementsByTagName('script'); /* 取出head節點,再新生成的節點新增到head中 */ var head = document.getElementsByTagName('head')[0]; /* 把script中的指令碼或要引入的外部 指令碼 */ for( var i=0;i
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-711955/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Android】不使用WebView來執行Javascript指令碼(Rhino)AndroidWebViewJavaScript指令碼
- C# 執行Javascript指令碼C#JavaScript指令碼
- Selenium執行JavaScript指令碼JavaScript指令碼
- 執行Shell指令碼的方式(轉)指令碼
- javascript指令碼何時被執行JavaScript指令碼
- javascript指令碼何時會被執行JavaScript指令碼
- 誰能幫我讓liferay執行正常起來?
- 如何讓指令碼在任意地方可執行指令碼
- node 執行JavaScript 指令碼 測試axiosJavaScript指令碼iOS
- MySQL索引型別一覽 讓MySQL高效執行起來MySql索引型別
- 治理、質量和管理:讓鬆散耦合執行起來
- 讓Jenkins執行GitHub上的pipeline指令碼JenkinsGithub指令碼
- 執行起來很慢呀。
- javascript指令碼新增受信任站點JavaScript指令碼
- 讓開源軟體真正用起來在於執行力
- Intellij 外掛新秀【CommentShell】, 讓你的註釋執行起來IntelliJ
- 如何讓shell指令碼變成可執行檔案指令碼
- 一行程式碼讓你的TableView動起來-iOS動畫行程ViewiOS動畫
- 工作中用到的指令碼合集指令碼
- [轉載]ubuntu中執行python指令碼UbuntuPython指令碼
- 《球球大作戰》原始碼解析——(1)執行起來原始碼
- 執行shell指令碼指令碼
- 指令碼執行方式指令碼
- 執行Shell指令碼的方式指令碼
- 我們一起來玩轉 Grep 指令
- Flutter是如何在iOS上執行起來的原始碼解讀FlutteriOS原始碼
- mybatis執行sql指令碼MyBatisSQL指令碼
- crontab執行shell指令碼指令碼
- PowerShell 指令碼執行策略指令碼
- SQL SERVER執行指令碼SQLServer指令碼
- 指令碼後臺執行指令碼
- 執行python指令碼後臺執行Python指令碼
- 初學者一點也不想讓自己的程式碼糊里糊塗地執行起來,初學者希望把程式碼清清楚楚理所當然地執行起來,這兩者有很大的差別。
- 透過shell指令碼來得到不穩定的執行計劃指令碼
- 通過shell指令碼來得到不穩定的執行計劃指令碼
- DRF類檢視讓你的程式碼DRY起來
- RouterOS 限速指令碼和限執行緒指令碼ROS指令碼執行緒
- 原來JavaScript是這樣執行的JavaScript