Javascript 在页面加载和再次单击按钮时调用函数,但参数不同

Javascript 在页面加载和再次单击按钮时调用函数,但参数不同,javascript,jquery,Javascript,Jquery,我有一个Ajax函数,它提供web方法的数据并将其显示在页面上。我想在页面加载中显示包含4项的第一页。单击按钮时,应显示接下来的四个项目,以此类推。这会在页面加载时执行,但当我单击按钮时,什么也不会发生 $(document).ready(function () { var s; var countnumber = 0; function dos(s, countnumber) { participant = s.spl

我有一个Ajax函数,它提供web方法的数据并将其显示在页面上。我想在页面加载中显示包含4项的第一页。单击按钮时,应显示接下来的四个项目,以此类推。这会在页面加载时执行,但当我单击按钮时,什么也不会发生

 $(document).ready(function () {
        var s;
        var countnumber = 0;
        function dos(s, countnumber) {

            participant = s.split("!");
            var i
            for (i = countnumber; i < countnumber + 4; i++) {
                part = participant[i].split("ٌ");

                rk = part[5];

                if (rk == 1) {
                    $("#ts" + i).attr('src', 'con1.png'); 
                } else if (rk == 2) {
                    $("#ts" + i).attr('src', 'con2.png');
                } else if (rk == 3) {
                    $("#ts" + i).attr('src', 'con3.png');
                } else if (rk > 3 && rk < 20) {
                    $("#ts" + i).attr('src', 'briliant.ico');
                } else if (arrlist[5] > 20 && arrlist[5] < 50) {
                    $("#ts").attr('src', 'cup.png');
                } else {
                    $("#ts" + i).attr('src', 'box.png');
                }
                    { $("#st" + i) }
                    $("#use" + i).html(part[1]);
                    $("#rnk" + i).html(part[5]);
                    $("#avg" + i).html(part[2]);
                    $("#pnt" + i).html(part[4]);
                    $("#wit" + i).html(part[3]);
                    $("#kl" + i).html(part[0]);
                    $("#use" + i).html(username);
                }

        }
        $('#kil').bind('click', function () {
            countnumber = countnumber + 4;
            dos(s , countnumber);
        })

        var arrlist;
        var participant, part;
        var username, klll, wt, pt, av, rk;


        $.ajax({
            type: "POST",
            url: "rank.aspx/bringdata",
            data: "",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: function (ret) {
                s = ret.d;
                dos(s, 0);
            },
            error: function (x, e) {
                alert("error");
            }
        });
    });
$(文档).ready(函数(){
var s;
var countnumber=0;
函数dos(s,countnumber){
参与者=s.split(“!”);
变量i
对于(i=countnumber;i3&&rk<20){
$(“#ts”+i.attr('src','briliant.ico');
}否则如果(arrlist[5]>20&&arrlist[5]<50){
$(“#ts”).attr('src','cup.png');
}否则{
$(“#ts”+i.attr('src','box.png');
}
{$(#st+i)}
$(“#use”+i).html(第[1]部分);
$(“#rnk”+i).html(第[5]部分);
$(#avg+i).html(第[2]部分);
$(#pnt+i).html(第[4]部分);
$(“#wit”+i).html(第[3]部分);
$(“#kl”+i).html(第[0]部分);
$(#use“+i).html(用户名);
}
}
$('kil').bind('click',function(){
countnumber=countnumber+4;
dos(s,countnumber);
})
var-arrlist;
var参与者,部分;
变量用户名、klll、wt、pt、av、rk;
$.ajax({
类型:“POST”,
url:“rank.aspx/bringdata”,
数据:“,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:true,
cache:false,
成功:功能(ret){
s=ret.d;
dos(s,0);
},
错误:函数(x,e){
警报(“错误”);
}
});
});
据我所知,您正试图通过
onclick=”“
事件执行
dos()
函数

它不起作用的原因很简单:
dos()
从全局范围的角度来看是不存在的

您必须执行以下两项操作之一:

  • dos()
    函数移动到全局可访问的作用域中
  • 通过jQuery将
    dos()
    函数附加到
    单击事件
  • 就个人而言,我更喜欢第二个选项,因为它避免了对全局名称空间的污染

    从局部变量 示例:局部变量

    function f() {
        var x = 1;
    }
    
    process_x(x); # this will trigger a "ReferenceError: x is not defined"
    
    我相信您知道,从外部访问函数的局部变量是不可能的

    本地功能- 在函数中定义函数时,实际上是在创建一个恰好是函数的局部变量

    示例:函数声明,这是您拥有的表单:

    $(document).ready(function() { # enclosing_function
        function dos() {
    
        }
    });
    
    如前所述,这将导致
    dos()
    成为
    封闭函数的本地函数

    ... 本质上是一样的 您可以这样想,以便更好地说明相似性:

    示例:函数表达式

    $(document).ready(function() { # enclosing_function
        var dos = function () {
    
        };
    });
    
    提升colo–功能高 在本例中,这两个版本是等效的。然而,函数声明——也就是没有赋值的东西(即所谓的“函数表达式”)——被“挂起”在代码的顶部,在代码中定义它们

    这意味着,定义被移动(或“提升”)到其定义范围的最顶端(或开始)。在定义该函数之前,不可能执行代码(在该范围内)。因此,您无法接收函数声明的
    ReferenceError
    。(除非您在错误的范围内,即)

    另一方面,函数表达式的求值方式与所有其他语句的求值方式相同:只要程序流遇到它们

    示例:吊装

    $(document).ready(function() { # enclosing_function
        # <- This is where "hoisted" is being defined <--
        non_hoisted(); # ReferenceError                 |
        hoisted();     # Works fine                     |
        var non_hoisted = function () { # This is where "non_hoisted" is defined
                                                        |
        };                                              ^
                                                    hoisting
        non_hoisted(); # Works fine                     ^
                                                        |
        function hoisted() { ------>-------->------->----
    
        }
    });
    
    形式参数
    s
    s
    作为局部变量引入
    dos()
    函数中。它将把
    s
    变量从其父范围中隐藏起来


    为什么要将
    s
    作为参数传递给
    dos()
    函数?当Ajax请求成功返回时,您已经将其分配给
    封闭函数()中的局部变量
    var s

    但是您的代码看起来是正确的。你会犯什么错误?你是否使用过一些调试工具(firebug、Chrome控制台)?没有。它是第一次在页面加载中执行,但不适用于onclick Events,因为freakish说代码看起来是可行的,但是如果没有看到通过ajax返回的数据,调试起来就很困难。。例如,如果您的数据仅返回4个项目,则单击时会导致代码不起任何作用。您是否在ASP.NET中使用此脚本?否,我使用页面加载测试它,并使用函数带出所有数据,我可以在页面加载中显示每个项目,但单击一次不起作用一个措辞良好且全面的答案,&您的陈述基本正确。除了dos()不会“在ajax调用后停止存在”这一事实。在“本地范围”中创建函数时,当前范围会记住其定义&其中定义的所有范围/函数(即当前范围内的其他本地函数)。因为量子62
    var s;
    function dos(s, countnumber) {
        ...
    }