2012-10-10 88 views
0

我從一個外部JS文件中插入一些JS,我想在JS文件中插入一個JS函數。我無法觸及HTML文件中的JS腳本,所以我想知道這個方法是否可以完成。從外部腳本插入JavaScript到HTML中的JavaScript

這裏是JS我想插入在HTML文件中的JS函數的內部。

// FIRST JS TO INSERT 
if (OS == "mobile"){ 
     killVideoPlayer(); 
    } 

// SECOND JS TO INSERT 
if (OS == "mobile"){ 
     loadHtmlFiveVideo(); 
     if (!document.all){ 
      flvPlayerLoaded = false; 
     } 
    }else { 
     loadVideoPlayer(); 
    } 

然後我想插入到這裏。

<script> 
function mediaTypeCheck() { 
if (bsiCompleteArray[arrayIndex].mediaType == "video") { 
// INSERT FIRST JS HERE 
    document.getElementById("bsi-video-wrap").style.display = "block"; 
    document.getElementById('pngBsi').style.display = "block"; 
    document.getElementById("frame_photo").style.display = "none"; 
    document.getElementById("relativeFrame").style.display = "block"; 
    document.getElementById("buy-me-photo-button-bsi").style.display = "none"; 
// INSTER SECOND JS HERE  
    loadVideoPlayer(); 
} 
if (bsiCompleteArray[arrayIndex].mediaType == "photo") { 
    killVideoPlayer(); 
    document.getElementById("bsi-video-wrap").style.display = "none"; 
    document.getElementById('pngBsi').style.display = "block"; 
    document.getElementById("relativeFrame").style.display = "block"; 
    document.getElementById("frame_photo").style.display = "block"; 
    document.getElementById("buy-me-photo-button-bsi").style.display = "block"; 
    if (!document.all){ 
     flvPlayerLoaded = false; 
    } 
} 
} 
</script> 

謝謝!

回答

1

在JavaScript中,您可以覆蓋新的變量包括函數在內的任何時間值。

通過它的外觀,你可以用你自己需要的功能代替mediaTypeCheck功能,然後調用原始功能。

E.g.

(function(){ 
    // keep track of the original mediaTypeCheck 
    var old_function = mediaTypeCheck; 
    // overwrite mediaTypeCheck with your wrapper function 
    mediaTypeCheck = function() { 
    if (conditions) { 
     // do whatever you need to, then ... 
    } 
    return old_function(); 
    }; 
})(); 

上面的代碼可以從任何腳本加載,只要它在定義mediaTypeCheck函數後發生。

+0

使用此代碼時出現錯誤。 Uncaught SyntaxError:意外的標記功能 – Justin

+0

複製粘貼錯誤,全部修復 – jimbojw

+0

所以我對它進行了一些改進,以便檢查以確保首先加載該功能。我把你的代碼放在'setInterval(function(){if(typeof mediaTypeCheck ==='function'){你的代碼在這裏},100);'它完美的工作! – Justin

0

你不能在JS中插入JS。 可以在DOM中插入另一個標籤,併爲外部JS文件指定SRC。

+0

真的嗎?一些像emberjs這樣的庫可以將字符串作爲字符串來處理,所以我希望用這種技術在另一個腳本中插入一個腳本是可能的。雖然我沒有嘗試過。 – Christophe

+1

當然,這是可能的,不是初學者。 –

0

您可以使用$.getScript(url)直接插入js文件;

如果您有腳本作爲文本,那麼您可以創建腳本標記。

var script = docuent.createElement('script'); 
script.innerText = text; 
document.getElementsByTagName('head')[0].appendChild(script); 
1

對我來說,最簡單的方法是使用服務器端包含。根據您的後端,您可以設置一個PHP或ASP頁面或任何類似模仿「.js」的MIME類型來響應。

我不是一個PHP的傢伙,但你會做這樣的事情:(如果我的語法不正確,請別人解決這個問題)

<?php 
//adding this header will make your browser think that this is a real .js page 
header('Content-Type: application/javascript'); 
?> 

//your normal javascript here 
<script> 
function mediaTypeCheck() { 
if (bsiCompleteArray[arrayIndex].mediaType == "video") { 

//here is where you would 'include' your first javascript page 
<?php 
     require_once(dirname(__FILE__) . "/file.php"); 
?> 

//now continue on with your normal javascript code 
document.getElementById("bsi-video-wrap").style.display = "block"; 
document.getElementById('pngBsi').style.display = "block"; 
....... 
0

你的情況的問題是你不能觸摸HTML中的腳本,所以我會說它不能在客戶端完成。

如果你至少可以觸摸的腳本標籤(不是腳本本身),那麼你可以添加自定義類型來處理它,它執行之前,例如:

<script type="WaitForInsert"> 
0

你的問題看起來有些奇怪,但似乎是可能的。嘗試我的快速/髒髒的工作代碼,並執行您自己的情況:

$(document.body).ready(function loadBody(){ 
var testStr = test.toString(); 
    var indexAcc = testStr.indexOf("{"); 
    var part1 = testStr.substr(0, indexAcc + 1); 
    var part2 = testStr.substr(indexAcc + 1, testStr.length - indexAcc - 2); 
    var split = part2.split(";"); 
    split.pop(); 
    split.splice(0,0, "alert('a')"); 
    split.splice(split.length -1, 0, "alert('d')"); 
    var newStr = part1 + split.join(";") + ";" + "}"; 
    $.globalEval(newStr); 
    test(); 
} 
function test(){ 
    alert('b'); 
    alert('c'); 
    alert('e'); 
} 
+0

問題在於你太晚了,在你準備好文檔並且有機會調整它之前,腳本已經被執行了。 – Christophe