jQuery Raty 在点击事件中设置分数

Posted

技术标签:

【中文标题】jQuery Raty 在点击事件中设置分数【英文标题】:jQuery Raty set score inside click event 【发布时间】:2015-09-08 18:26:36 【问题描述】:

我正在尝试使用this 评分插件,但我无法在点击时设置新分数。

我正在对点击事件发出 ajax 请求并获得新的计算分数。我想在点击事件中设置新分数。正确的做法是什么?

<div class="rating" data-id="some-int" data-score="0.5"></div>

javascript

$(".rating").raty(
    score: function ()  return $(this).attr("data-score"); ,
    click: function (score, evt) 
        $.ajax(
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "./ajax.asmx/RateImage",
            data: " ImgId: " + $(this).attr("data-id") + ", Score: " + score + "",
            dataType: "json",
            async: false,
            success: function (result)  actionResult = result.d; 
        );

        if (actionResult.Success) 
            console.log("Score: " + actionResult.Message);
            score = actionResult.Message;
         else  // cancel rating
            alert(actionResult.Message);
            return false;
        
    
);

【问题讨论】:

为什么要同步 (async: false)?为什么不是异步调用?像这样:jsfiddle.net/8kcu8qsr/2 你看到我链接的小提琴了吗? @abhitalks 我不太了解异步的详细信息。如果设置为 true,则 actionResult 未定义。所以即使结果没有完成,ajax 块之后的代码也会继续运行。这不是我想要的。 要了解更多关于 AJAX、Async 以及如何使用返回值的信息,请参阅这个规范的 QA:***.com/q/14220321/1355315 很高兴知道。谢谢你。我会修复我的代码块。 【参考方案1】:

有一个内置的方法来设置新的分数,所以只需使用:

$('.rating').each(function(i) 
    var thisRating = $(this);
    thisRating.raty(
        score: function () 
            return $(this).data('score');
        ,
        click: function (score, evt) 
            $.ajax(
                type: 'post',
                contentType: 'application/json; charset=utf-8',
                url: './ajax.asmx/RateImage',
                data: 
                    ImgId: thisRating.data('id'),
                    Score: score
                ,
                dataType: "json",
                success: function (result) 
                    thisRating.raty('score', result.d.Message);
                
            );
            return false;
        
    );
);

在docs - Functions 下你会发现:

$('#star').raty('score');

获取当前分数。如果没有分数,则 undefined 将是 返回。

$('#star').raty('score', number);

设置分数。

【讨论】:

两者 $(this).raty("setScore", actionResult.Message);和 $(this).raty("score", actionResult.Message);工作,但问题是在此代码行之后设置了选定的值。所以我添加了 return false;以防止进一步的分配。谢谢。【参考方案2】:

你可以的

$(".rating").raty('setScore', score);

看看效果

http://codepen.io/anon/pen/qdVQyO

【讨论】:

【参考方案3】:

根据文档,您可以简单地使用$('#selector').raty(score: 3) 来设置分数。所以在回调中,你可以像这样调用$(".rating").raty(score: actionResult.Message)

$(".rating").raty(
    score: function ()  return $(this).attr("data-score"); ,
    click: function (score, evt) 
        $.ajax(
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "./ajax.asmx/RateImage",
            data: " ImgId: " + $(this).attr("data-id") + ", Score: " + score + "",
            dataType: "json",
            async: false,
            success: function (result)  actionResult = result.d; 
        );

        if (actionResult.Success) 
            console.log("Score: " + actionResult.Message);
            $(".rating").raty(score: actionResult.Message);
         else  // cancel rating
            alert(actionResult.Message);
            return false;
        
    
);

【讨论】:

当我使用这个或 $(this).raty(score: actionResult.Message);元素重新初始化。所以我不能用这个。 @HasanGürsoy 元素重新初始化有什么问题? 它失去了所有的属性和事件。

以上是关于jQuery Raty 在点击事件中设置分数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 表单输入字段中设置事件处理程序

如何在ListView中设置item的点击事件

jquery 比率在 0.5 间隔内获得分数

如何在jquery或javascript中设置函数调用的顺序或优先级?

vue中设置子组件的点击事件不影响父组件的点击事件

JAVA中设置鼠标点击事件怎么设置啊?为啥没反应?跪谢