我有一个页面movies.jsp
,它是通过页面home.jsp
中的ajax调用的。 movies.jsp
包含IMDB评级插件的代码(link):
<span class="imdbRatingPlugin" data-user="ur17960624" data-title="<%=request.getParameter("movieId") %>" data-style="p4">
<a href="http://www.imdb.com/title/<%=request.getParameter("movieId") %>/?ref_=plg_rt_1">
<img src="http://g-ecx.images-amazon.com/images/G/01/imdb/plugins/rating/images/imdb_31x14.png" alt="Oz the Great and Powerful (2013) on IMDb" />
</a>
</span>
<script>(function(d,s,id){var js,stags=d.getElementsByTagName(s)[0];if(d.getElementById(id)){return;}js=d.createElement(s);js.id=id;js.src="http://g-ec2.images-amazon.com/images/G/01/imdb/plugins/rating/js/rating.min.js";stags.parentNode.insertBefore(js,stags);})(document,'script','imdb-rating-api');</script>
我的ajax请求就像这样调用:
$(document).on('click', 'imdb-button', function(){
$('content').load('movies.jsp&movieId='+imdbmovieId');
});
问题是请求第一次正常,但点击其他movieIds的其他电影只返回IMDB徽标,没有评级。我怀疑插件中的脚本存在问题。我尝试将脚本封装在jquery函数中,并且每次都将该函数作为load
的回调函数触发,但这不起作用。和想法?
答案 0 :(得分:1)
我也在修补插件,可以分享一些见解。如果您在初始页面加载后插入IMDb评级,则每次添加元素时都需要调用rating.min.js
。您也可以调用imdb.rating.createJSONP()
函数,这可能是更好的解决方案,因为不需要再次加载整个脚本。您应该知道该函数会遍历它找到的所有imdb <span>
标记。
IMDb评级插件库实际上在version中得到了很好的解释和评论。
答案 1 :(得分:1)
我解决了问题。问题是,在每个ajax请求中,它都在创建以下脚本标记:
<script src="http://g-ec2.images-amazon.com/images/G/01/imdb/plugins/rating/js/rating.min.js" id="imdb-jsonp-tt12312312">
</script>
多个ajax意味着多个这样的标签,并且有些混淆。我尝试了以下黑客攻击并且有效:
$(document).on('click', 'imdb-button', function(){
$('content').load('movies.jsp&movieId='+imdbmovieId', function(){
imdbRatingTrigger();
});
});
function imdbRatingTrigger(){
$('[id^="imdb-jsonp"]').remove(); //to prevent creation of multiple script tags.
(function(d,s,id){
var js,stags=d.getElementsByTagName(s)[0];if(d.getElementById(id)){}js=d.createElement(s);js.id=id;js.src="http://g-ec2.images-amazon.com/images/G/01/imdb/plugins/rating/js/rating.min.js";stags.parentNode.insertBefore(js,stags);
})(document,'script','imdb-rating-api');
}
$('[id^="imdb-jsonp"]').remove();
有助于删除这些重复的脚本标记。我还从javascript函数中移除了return;
- function(d,s,id()
现在强制函数每次都完全运行。我不明白这个黑客背后的完整科学,但它的确有效。