迷失在jQuery .each()中 - php

在下面的脚本中,我试图解析一个选择列表,并为每个选项调用一个基于选项“值”属性返回值(伪真/假)的php。

但是,当我在$ .get里面[以评估返回值并针对each()中的当前选项执行脚本时,]我不知道如何引用当前的option元素来对其进行修改。

$('#my_Select').click(
    function(){ 
        $('#my_Select option').each(
            function(){
                $.get(
                    '<?php echo getStyle.php',{option: $(this).val()},
                    function(response){
                        alert($(this).val()); //Returns empty alert. Should return value of current option
                        //$(this).attr("disabled","disabled");
                        //if (response.Success){$(this).attr("disabled","disabled");}
                    });
            });
    });

这是供参考的php脚本...

<?php 
    //getStyle.php

    $myOption = $_REQUEST['option'];
    $file = "styles/".$myOption."/style.css";
    //echo json_encode(file_exists($file));
        if (!file_exists($file))
        {
        $Response = array('Success' => true);
        }
        else
        {
        $Response = array('Success' => false);
        }
    echo json_encode($Response);
?>

参考方案

this成功回调中的get不再引用该元素(只要有新函数,该函数中的this可能与外部的this不同,并且可能会有所不同; )。

您可以使用已有的闭包来解决此问题:

$('#my_Select').click(
    function(){ 
        $('#my_Select option').each(
            function(){
                // ===> Remember the option here, in a variable your callback will close over
                var option = $(this);
                $.get(
                    '<?php echo getStyle.php',{option: option.val()},
                    function(response){
                        // ===> Use the variable below
                        alert(option.val()); //Returns empty alert. Should return value of current option
                        //option.attr("disabled","disabled");
                        //if (response.Success){option.attr("disabled","disabled");}
                    });
            });
    });

或者,您可以使用ajax代替get(无论如何get只是一个包装器),并使用context参数告诉jQuery调用回调时对this使用什么:

$('#my_Select').click(
    function(){ 
        $('#my_Select option').each(
            function(){
                $.ajax({
                   url:     '<?php echo getStyle.php',
                   data:    {option: $(this).val()},
                   context: this,
                   success: function(response){
                            alert($(this).val()); //Returns empty alert. Should return value of current option
                            //$(this).attr("disabled","disabled");
                            //if (response.Success){$(this).attr("disabled","disabled");}
                       }
                    });
            });
    });

编辑:下面,@ Hakre问,参考上面的第一个示例:

由于并发,在回调函数中option的值不是不可预测的吗?

答案是否定的,但这是一个很好的问题。原因在于JavaScript解析自由符号(例如,独立的“变量”名称)以及闭包如何工作的核心。

调用函数时,JavaScript解释器会为该特定函数调用创建一个称为“执行上下文”的东西。该执行上下文具有我们称为“变量对象”的内容,该变量包含变量,并且与该函数的此特定调用有关(从技术上讲,它们保留在执行上下文的变量上下文的[深呼吸]绑定对象上) —要爱规范说话)。

在该函数调用中创建的函数会在创建它们的执行上下文中保留对变量对象的引用。这就是关闭的工作方式。解释器通过查看此函数调用的变量对象来解析自由符号,以查看是否存在匹配的变量(我在这里简化)。如果没有,它将在变量对象中查找包含执行上下文的对象,然后再查找该对象之外的对象,等等,依此类推,直到到达全局上下文为止。 (这是全局变量的工作方式;它们是闭包的自然结果。)此变量对象链称为作用域链。

因此,在上面,有多个option变量,每个变量本质上都与同一调用中定义的get回调相关联。这样,无论何时,该回调都将看到正确的option变量。

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…

jQuery,PHP,AJAX,无故发布的“ tu”变量beeing,显示在var_dump()中 - php

jQuery AJAX向page.php请求.post()的数据,这将创建$ res和var_dump()s。$ res:$res = array(); foreach ($_REQUEST as $key => $value) { if($key){ $res[$key] = $value; } } var_dump($ res):array(4) …

PHP:将数组值加在一起 - php

我相信这比标题听起来要难一些,但我可能完全错了。我有一个像这样的数组:[["londrina",15],["cascavel",34],["londrina",23],['tiradentes',34],['tiradentes',21]] 我希望能够采用通用…

PHP JQuery复选框 - php

我有以下片段。 var myData = { video: $("input[name='video[]']:checked").serialize(), sinopse: $("#sinopse").val(), dia: $("#dia").val(), quem: $(&#…

PHP:不推荐使用password_hash的'salt'选项 - php

我正在使用密码哈希进行注册。我需要手动创建Salt,以下是我使用的代码:$options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) ]; $password = password_hash( $this->…