A Issue When Inject A Javascript Code That Overrides The One Existing In Dom?
Solution 1:
I found My injected <script> runs after the target-page's javascript, despite using run_at: document_start? which has pointed out the reason and gave a work-around solution.
But it is really difficult to write js code into a string like that. So I wrote a python code to read and generate them.
import sys
s_injector_header = """
function injectJs(text) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.textContent=text;
document.documentElement.appendChild(scr);
}
"""defopenInjector():
fd = open(sys.path[0]+"/js_injector.js","w")
fd.write(s_injector_header)
return fd
defcloseInjector(fd):
fd.close()
definjectJs(fd,filename):
jsfd = open(sys.path[0]+"/"+filename,"r")
text = jsfd.read()
text = text.replace("\\","\\\\")
text = text.replace("'","\\'")
text = text.replace('"','\\"')
text = text.replace('\n','\\n')
fd.write("injectJs('"+text+"');\n\n")
defmain():
fd = openInjector()
injectJs(fd,"md5.js")
injectJs(fd,"dessrc.js")
injectJs(fd,"my_code.js")
closeInjector(fd)
if __name__ == '__main__':
main()
Solution 2:
The order of execution is certainly not random.
What your function injectJS is doing is creating a tag with a "src" field of my.js
. Then injecting that into your HTML. Which means my.js
is included asynchronously.
Here is what test.html sees:
<script src="my.js"></script>
Because of it being asynchronous, the contents of my.js are not always loaded when you want. To mitigate this issue, you do not want to include my.js
, you want to include the contents of my.js
.
Using Broswerify's brfs, you can put a require()
statement into your browser side code and have it inject the actual file contents.
After the right installs, your js_injector.js
would need the following:
//js_injector.jsvar fs = require('fs');
functioninjectJs(link) {
//Create script tag with full file content as the contentvar scr = document.createElement('script');
link = fs.readFileSync(__dirname + '/inject.js', 'utf-8');
scr.textContent = link;
(document.head || document.documentElement).appendChild(src);
}
injectJs('my.js');
Which would give you the following and the behavior you expect:
//test.html
<script>console.log("in my.js");
functionfoo() {
console.log("in my.js foo");
}
</script>
Post a Comment for "A Issue When Inject A Javascript Code That Overrides The One Existing In Dom?"