<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<script src="../lib/jquery-2.1.4.js"></script>
</head>
<body>
<div>nothing</div>
<script type="text/html" id="apple">
<div>
一个苹果
</div>
<script type="text/javascript">
var num = 1;
alert(num);
</script>
</script>
</body>
<script type="text/javascript">
console.log($("#apple").html());
//console.log(document.getElementById('apple').innerHTML);
</script>
</html>
浏览器控制台输出如下:
很明显,丢失了一个</script>标签。原因就是对<script>标签进行了错误的匹配。
Google了一番,在*上找到了两个相关话题。
https://*.com/questions/2699320/jquery-script-tags-in-the-html-are-parsed-out-by-jquery-and-not-executed
https://*.com/questions/4079179/jquery-html-strips-out-script-tags
请教一下大家,这种script标签嵌套的情况下,如何可以得到正确的html内容。
16 个解决方案
#1
<script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.body.appendChild(script);
script.innerHTML = str;
</script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.body.appendChild(script);
script.innerHTML = str;
</script>
#2
你这样创建一个script标签,附加到body部分。与如下是等同的吧。
<body>
<div>nothing</div>
<script type="text/html" id="apple">
<div>
一个苹果
</div>
</script>
<script type="text/javascript">
var num = 1;
</script>
</body>
我要请教的是在script嵌套的情况下,如何通过html()方法正确获取网页内容,不出<script>标签匹配错乱的情况。
#3
变通一下嘛
告诉了你原理你应该就知道拉
这时动态生成script的原理嘛
给你加个id
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
#4
<script id="abc">
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
</script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
</script>
#5
这样虽然是个办法,但是如果我内嵌的那个script标签内容很长,就需要构造一个非常长的字符串。有没有别的办法呀,亲。
#6
问题是你为啥要这样用。说一下需求
#7
为什么要在一个script里嵌一个script。。。好奇怪的写法,而且这么写看起来不乱吗
#8
需求是这样的。
微信WEUI展示页
官方给了这个页面的远吗,里面实现了一种单页前端路由控制页面跳转。在index.html中就包含了多个模板页,每个模板页的代码如下:
<script type="text/html" id="tpl_xx">模板页</script>
模板页中有html代码,也有js代码。(这样就出现了script标签嵌套)
我看了下官方的js文件,
某博客对该js文件的大概介绍
看的不是很懂,在_go方法中有如下两段代码:
var html = $(config.template).html();
var $html = $(html).addClass('slideIn').addClass(config.name);
this.$container.append($html);
我感觉就是在这边根据hash(url中#后面的内容)变化,取到对应模板页中的html内容,然后重新渲染页面。(也不知道是不是这样子)
我现在遇到的问题就是,模板页中的js方法不能执行了,然后同时也发现了jquery的html()方法会出现<script>标签匹配错误的情况。因此猜想是否因为这个原因,导致模板页代码不完整,进而导致模板页中的js代码不被执行。
#9
亲,8#有写为什么这样写的说明。
#10
其实它讲到的是路由
#11
我看了它的源代码,用了jq的load方法,这个我之前也用过,跟iframe相似
它的意思是(下面我按照我的想法来给你解释)
比如
在列表1里面有个button,
先获取你点击的button位置的text(),这个时候获取到button这个字符串
然后它去找script里面的id="tpl_xx"
看哪个xx等于刚才获取到的字符串,就像刚才获取到button,就处理获取到了script id="tpl_button"这个script
然后横版有个父页面,假设横版页的id="fu"
它先把fu.html()清空
然后把scirpt id="tpl_button"的html()内容load()进fu.html()里面
大概就这样
load其实跟以前的iframe一样
就是换个src没啥区别
它的意思是(下面我按照我的想法来给你解释)
比如
在列表1里面有个button,
先获取你点击的button位置的text(),这个时候获取到button这个字符串
然后它去找script里面的id="tpl_xx"
看哪个xx等于刚才获取到的字符串,就像刚才获取到button,就处理获取到了script id="tpl_button"这个script
然后横版有个父页面,假设横版页的id="fu"
它先把fu.html()清空
然后把scirpt id="tpl_button"的html()内容load()进fu.html()里面
大概就这样
load其实跟以前的iframe一样
就是换个src没啥区别
#12
为什么它那里没有报错呢?
你看它的
<script type="text/html">
它默认读取为html
你看它的
<script type="text/html">
它默认读取为html
#13
横版的父页面是一个DIV,他的id选择器是container。我怎么就没发现源码中有load方法以及对这个DIV清空。只看到了append方法。
#14
#15
现在直接实战给你看吧
看着上面那个图,你会发现,class=page是路由load的,load的button里面的那堆html页面,就找到id=button的script
然后最后是让他显示出来,js_show就是把本来隐藏的横版display:block一样
这三个class都是事先写好css的
它load的是图片缓存图片。搞错,确实是append<script>里面的内容
教你一个例子
看着上面那个图,你会发现,class=page是路由load的,load的button里面的那堆html页面,就找到id=button的script
然后最后是让他显示出来,js_show就是把本来隐藏的横版display:block一样
这三个class都是事先写好css的
它load的是图片缓存图片。搞错,确实是append<script>里面的内容
教你一个例子
<script src="js/jquery-3.1.1.js"></script>
<style>
html,body {
width: 100%;
height: 100%;
}
* {
margin: 0;
padding: 0;
}
.page {
width: 100%;
height: 100%;
background-color: red;
position: absolute;
z-index: 1;
top: 0;
display: none;
}
.js_show {
display: block;
}
</style>
</head>
<body>
<button id="open">点我</button>
<script>
$('#open').click(function() {
$('#open').after('<div class="page"></div>');
$('.page').append($('#button').html());
$('.page').addClass('button');
$('.page').addClass('js_show');
});
</script>
<script type="text/html" id="button">
<button>我是按钮页面</button>
</script>
</body>
#16
这个buton可以换成a这样跳转到横版页的时候就可以带参数href="/#button"
#1
<script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.body.appendChild(script);
script.innerHTML = str;
</script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.body.appendChild(script);
script.innerHTML = str;
</script>
#2
你这样创建一个script标签,附加到body部分。与如下是等同的吧。
<body>
<div>nothing</div>
<script type="text/html" id="apple">
<div>
一个苹果
</div>
</script>
<script type="text/javascript">
var num = 1;
</script>
</body>
我要请教的是在script嵌套的情况下,如何通过html()方法正确获取网页内容,不出<script>标签匹配错乱的情况。
#3
变通一下嘛
告诉了你原理你应该就知道拉
这时动态生成script的原理嘛
给你加个id
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
#4
<script id="abc">
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
</script>
var script= document.createElement('script');
var str = 'var num = 1;alert(num);';
document.getElementById('abc').appendChild(script);
script.innerHTML = str;
</script>
#5
这样虽然是个办法,但是如果我内嵌的那个script标签内容很长,就需要构造一个非常长的字符串。有没有别的办法呀,亲。
#6
问题是你为啥要这样用。说一下需求
#7
为什么要在一个script里嵌一个script。。。好奇怪的写法,而且这么写看起来不乱吗
#8
需求是这样的。
微信WEUI展示页
官方给了这个页面的远吗,里面实现了一种单页前端路由控制页面跳转。在index.html中就包含了多个模板页,每个模板页的代码如下:
<script type="text/html" id="tpl_xx">模板页</script>
模板页中有html代码,也有js代码。(这样就出现了script标签嵌套)
我看了下官方的js文件,
某博客对该js文件的大概介绍
看的不是很懂,在_go方法中有如下两段代码:
var html = $(config.template).html();
var $html = $(html).addClass('slideIn').addClass(config.name);
this.$container.append($html);
我感觉就是在这边根据hash(url中#后面的内容)变化,取到对应模板页中的html内容,然后重新渲染页面。(也不知道是不是这样子)
我现在遇到的问题就是,模板页中的js方法不能执行了,然后同时也发现了jquery的html()方法会出现<script>标签匹配错误的情况。因此猜想是否因为这个原因,导致模板页代码不完整,进而导致模板页中的js代码不被执行。
#9
亲,8#有写为什么这样写的说明。
#10
其实它讲到的是路由
#11
我看了它的源代码,用了jq的load方法,这个我之前也用过,跟iframe相似
它的意思是(下面我按照我的想法来给你解释)
比如
在列表1里面有个button,
先获取你点击的button位置的text(),这个时候获取到button这个字符串
然后它去找script里面的id="tpl_xx"
看哪个xx等于刚才获取到的字符串,就像刚才获取到button,就处理获取到了script id="tpl_button"这个script
然后横版有个父页面,假设横版页的id="fu"
它先把fu.html()清空
然后把scirpt id="tpl_button"的html()内容load()进fu.html()里面
大概就这样
load其实跟以前的iframe一样
就是换个src没啥区别
它的意思是(下面我按照我的想法来给你解释)
比如
在列表1里面有个button,
先获取你点击的button位置的text(),这个时候获取到button这个字符串
然后它去找script里面的id="tpl_xx"
看哪个xx等于刚才获取到的字符串,就像刚才获取到button,就处理获取到了script id="tpl_button"这个script
然后横版有个父页面,假设横版页的id="fu"
它先把fu.html()清空
然后把scirpt id="tpl_button"的html()内容load()进fu.html()里面
大概就这样
load其实跟以前的iframe一样
就是换个src没啥区别
#12
为什么它那里没有报错呢?
你看它的
<script type="text/html">
它默认读取为html
你看它的
<script type="text/html">
它默认读取为html
#13
横版的父页面是一个DIV,他的id选择器是container。我怎么就没发现源码中有load方法以及对这个DIV清空。只看到了append方法。
#14
#15
现在直接实战给你看吧
看着上面那个图,你会发现,class=page是路由load的,load的button里面的那堆html页面,就找到id=button的script
然后最后是让他显示出来,js_show就是把本来隐藏的横版display:block一样
这三个class都是事先写好css的
它load的是图片缓存图片。搞错,确实是append<script>里面的内容
教你一个例子
看着上面那个图,你会发现,class=page是路由load的,load的button里面的那堆html页面,就找到id=button的script
然后最后是让他显示出来,js_show就是把本来隐藏的横版display:block一样
这三个class都是事先写好css的
它load的是图片缓存图片。搞错,确实是append<script>里面的内容
教你一个例子
<script src="js/jquery-3.1.1.js"></script>
<style>
html,body {
width: 100%;
height: 100%;
}
* {
margin: 0;
padding: 0;
}
.page {
width: 100%;
height: 100%;
background-color: red;
position: absolute;
z-index: 1;
top: 0;
display: none;
}
.js_show {
display: block;
}
</style>
</head>
<body>
<button id="open">点我</button>
<script>
$('#open').click(function() {
$('#open').after('<div class="page"></div>');
$('.page').append($('#button').html());
$('.page').addClass('button');
$('.page').addClass('js_show');
});
</script>
<script type="text/html" id="button">
<button>我是按钮页面</button>
</script>
</body>
#16
这个buton可以换成a这样跳转到横版页的时候就可以带参数href="/#button"