1

我有一个movies.jsp通过 ajax 从页面调用的页面home.jspmovies.jsp包含 IMDB 评级插件的代码(链接):

<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每次回调的回调,但这不起作用。和想法?

4

2 回答 2

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 意味着多个这样的标签,对于 . 我尝试了以下 hack 并且它有效:

$(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();有助于删除那些重复的脚本标签。我还return;从 javascript 函数中删除了 -function(d,s,id()现在它强制该函数每次都完全运行。我还没有理解这个黑客背后的完整科学,但它确实有效。

于 2013-03-19T08:37:23.610 回答
1

我也在修补插件,可以分享一些见解。如果您在初始页面加载后插入 IMDb 评级,那么您需要在rating.min.js每次添加元素时调用。您也可以调用imdb.rating.createJSONP()函数,这可能是一个更好的解决方案,因为不需要再次加载整个脚本。您应该知道该函数会遍历<span>它找到的所有 imdb 标记。

IMDb 评级插件库实际上在这个版本中得到了很好的解释和评论。

于 2013-03-19T01:05:57.690 回答