簡體   English   中英

附加包含document.write的JS文件

[英]Appending a JS file that contains document.write

我有一個JS腳本將.append()另一個腳本添加到body以及它附加的內容如下:

<script type=\"text\/javascript\" src=\"https:\/\/website\/creative\/camref:[ref]\/creativeref:[ref]\"><\/script>

在這個腳本里面它包含document.write() ,我不能修改這個文件。

它不會將腳本內部的內容寫入網站,我該如何解決這個問題? 異步工作(我知道異步承諾)?

您有三種選擇: 服務擁抱替換

自己服務腳本

如果您可以在自己的服務器上放置一些代碼,則可以使用該代碼獲取遠程腳本並在前端代碼的路上進行修改。 您的JavaScript代碼將使用您自己網站上的URL而不是遠程網站。 處理此URL的服務器代碼將獲取遠程腳本並執行文本替換以更改腳本中的document.write()調用以及與您的站點一起使用的其他代碼,例如通過使用jQuery / DOM調用。 然后它將此修改后的腳本作為自己的響應發送。

這可以很好地工作,但要注意遠程腳本的服務條款的潛在問題,以及可能的速率限制或更糟,因為所有對遠程服務器的請求現在都來自您的服務器而不是訪問者的瀏覽器。

擁抱document.write()

您從遠程服務器加載的腳本假定它將在頁面的<body>加載直接<script>標記。 這是document.write()唯一可以按預期工作的時間。 如果在加載頁面后從動態腳本調用document.write() ,則會消除當前頁面內容,如您所發現的那樣。

因此,不要使用.append()來加載遠程腳本,而是按照預期的方式加載它,並在頁面本身使用實際的<script>標記。 然后腳本的document.write()將在您加載它的位置寫入頁面,而不擦除頁面的其余部分。

但是如果你需要將動態參數傳遞給腳本呢? 假設您知道或可以在加載頁面時計算這些參數,您可以在自己的腳本(內聯或.js文件)中調用document.write() )來編寫加載遠程腳本的腳本標記。 這就像在HTML中內嵌遠程<script>標記一樣,除了您可以動態創建URL。

如果您需要將參數傳遞給腳本,直到稍后才知道(例如,從用戶輸入到頁面中),或者如果您以后無法加載腳本,則無法執行此操作。

例:

<!-- This goes inside the <body> tag where you want the remote script. -->
<script>
    var value = 'test';
    document.write(
        '<script src="https://example.com/script?foobar=', value,
        '"><\/script>'
    );
</script>
<!-- The remote script's document.write() output will go here. -->

替換document.write()

提供您自己的document.write()實現,該實現使用jQuery / DOM來獲取本已編寫的文本並將其動態插入到您想要的位置。

例:

// Do this in your JavaScript code immediately before using .append()
// or the like to load the remote script.
document.write = function() {
    // document.write can take multiple arguments, so concatenate them.
    var text = Array.prototype.slice.call( arguments ).join( '' );
    // Now text is what would have been written by document.write().
    // Use a DOM/jQuery/etc. call here to insert it into your page.
};
// Here is where you will load the remote script

現在,當遠程腳本調用document.write() ,它將真正調用您的函數,因此您可以根據需要處理它。

不會像這樣替換document.write()可能會破壞其他有效的代碼並合法地使用它嗎? 不,因為任何此類工作代碼都會在頁面加載期間運行,否則它將被破壞。 在頁面完全加載之后,您才能在以后更換該功能。

主要的風險是,如果你加載的其他代碼也使用同樣的技巧。 他們的document.write()替換和你的可以互相踩踏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM