如何在<;中运行JavaScript;脚本>;通过innerHTML注入内容时的标记?
我正在尝试为一个图库编写一个基于JavaScript的分页,它通过服务器上的如何在<;中运行JavaScript;脚本>;通过innerHTML注入内容时的标记?,javascript,Javascript,我正在尝试为一个图库编写一个基于JavaScript的分页,它通过服务器上的onClick-事件加载HTML。HTML仅通过innerHtml附加。唯一的困难是我需要用缩略图URL填充数组以进行预览。这方面的数据通过与HTML相同的HTTP请求提供 我试图通过标记将其添加到HTML中,但通过innerHtml插入时不会执行这些操作(请参阅) 约束条件: HTML必须在服务器上呈现,无需通过JavaScript手动创建HTML元素(由于模板的可交换性) 脚本和HTML必须通过单个HTTP请求提供
onClick
-事件加载HTML。HTML仅通过innerHtml
附加。唯一的困难是我需要用缩略图URL填充数组以进行预览。这方面的数据通过与HTML相同的HTTP请求提供
我试图通过
标记将其添加到HTML中,但通过innerHtml
插入时不会执行这些操作(请参阅)
约束条件:
- HTML必须在服务器上呈现,无需通过JavaScript手动创建HTML元素(由于模板的可交换性)
- 脚本和HTML必须通过单个HTTP请求提供(由于复杂性)
innerHTML
附加HTML,当HTTP请求返回时,数组数据可以传递给函数
元素中,并通过一些模糊的JS技巧提取其内容。但我肯定我会为此挨打的函数加载下一页(uri){
var xhr=new XMLHttpRequest();
xhr.open('GET',uri);
xhr.onload=函数(){
如果(xhr.status==200){
var loadNextButton=document.getElementById(“加载下一步按钮”);
loadNextButton.parentNode.removeChild(loadNextButton);
var vbw=document.getElementById(“vbw”);
vbw.innerHTML=vbw.innerHTML+xhr.response;
}否则{
conosole.log('Failed:'+xhr.status);
}
};
xhr.send();
}
让thumbNailStore={
concat:function(){
log('Concat已运行');
},
};
函数addThumbnailListeners(){
log('addThumbnailListeners已运行');
}
thumbNailStore.concat();//这将生成一个JSON,并将其附加到页面中的数组中
addThumbnailListeners();
加载更多
如果jQuery是一个选项,load()
将执行加载内容中包含的任何脚本元素,并修改内部HTML,这听起来像是您需要的
否则,可以使用eval。您只需要通过某种预定id检索脚本元素(可能是vbw
的最后一个脚本元素子元素),或者甚至通过从响应数据中创建元素并从中访问脚本子元素来检索。无论哪种方式,一旦拥有脚本元素对象:
eval(scriptElement.innterHtml)
如果jQuery是一个选项,load()
将执行加载内容中包含的任何脚本元素,并修改内部HTML,这听起来像是您需要的
否则,可以使用eval。您只需要通过某种预定id检索脚本元素(可能是vbw
的最后一个脚本元素子元素),或者甚至通过从响应数据中创建元素并从中访问脚本子元素来检索。无论哪种方式,一旦拥有脚本元素对象:
eval(scriptElement.innterHtml)代码>您的解决方案几乎正确,我将替换vbw.innerHTML=vbw.innerHTML+xhr.response使用.appendChild()
方法编写>。但我也注意到您正在添加倍数…
。因此,我认为如果你按下按钮加载更多两次,你的代码中就会有3个
标记
如何解决这个问题?
首先,提取内联脚本inlineScript
,并将其附加到当前脚本中。然后,使用DOMParser().parseFromString()
方法创建一个新文档。这将解析xhr.response
,然后获取
元素,最后将其附加到
中
以下是一个例子:
let匹配,点击count=0;
常量regexScript=/([\s\s]*?)/gi;
常量regexButton=/[\s\s]*?/gi;
让nodeCounter=document.getElementById('counter');
函数getResponse(){
//模拟来自服务器的响应
return`script type=“application/javascript”let thumbNailStore={concat:function(){console.log(';concat for videolist${clickCount}';)};function addThumbnailListeners(){console.log(&';addThumbnailListeners调用${clickCount}&';)}thumbNailStore concat(),addThumbnailListeners(),/scriptbutton id=“load next button”onclick=“loadNextPage('https://jsonplaceholder.typicode.com/users/1';)“加载更多/按钮”;
}
函数htmlDecode(输入){
var e=document.createElement('div');
e、 innerHTML=输入;
返回e.childNodes[0].nodeValue;;
}
函数加载下一页(uri){
设xhr=newXMLHttpRequest();
xhr.open('GET',uri);
xhr.onload=函数(){
如果(xhr.status==200){
//Im正在使用responseTest您应该使用xhr.response
让rawdata=htmlDecode(getResponse());
点击计数++
//脚本匹配
matches=Array.from(rawdata.matchAll(regexScript));
让rawScript=匹配[0][1];
让inlineScript=document.createTextNode(rawScript);
//按钮匹配
matches=Array.from(rawdata.matchAll(regexButton));
让rawButton=匹配[0];
让script=document.getElementById('loaded-script');
script.innerHTML='';
script.appendChild(inlineScript);
让loadNextButton=document.getElementById('load-next-button');
loadNextButton.parentNode.removeChild(loadNextButton);
设vbw=document.getElementById('vbw');
让doc=newdomparser().parseFromString(rawButton,'text/html');
//让脚本=doc.body.childNo