【问题标题】:Comparing two identical strings in JQuery returns false在 JQuery 中比较两个相同的字符串返回 false
【发布时间】:2016-04-17 02:54:49
【问题描述】:

我发现了一个有趣的问题,即来自 JQuery 的 AJAX 请求的回显值,我没有答案:

我的 data == "LOCKED" 永远不会返回 true(第 13 行)!

JQuery -> 按钮点击时的 AJAX 调用:

$.ajax({
        url: "ajax/login_ajax_call.php",
        method: "POST",
        data: { user: usr, password: pwd }
    }).done(function(data){
            if(data == true || data == "true"){          // -> this works with data beeing true (bool) or "true" (string)
                $("#form_submit").submit();
            }
            else{
                console.log(jQuery.type(data));          // -> (string)
                console.log(data);                       // -> "LOCKED" 
                console.log(jQuery.type("LOCKED"));      // -> (string)
                if(data == "LOCKED"){                    // also tried "===" but it never returns true
                    [...]            
                }
                else{
                    [...]
                }
            }
    }); 
});             

PHP(1) -> 获取一个类返回的值(PHP(2)):

include_once("../Classes/Login_check.php");
$lih = new Login_check();
$result = $lih -> check($_POST["user"], $_POST["password"]);
var_dump($result);                                     // -> string(6) "LOCKED"
echo $result;

PHP(2,“Login_check.php”):

[...]
// also tried: 
// $test = "LOCKED"; 
// var_dump($test);                                    // -> string(6) "LOCKED"
// return $test;
return "LOCKED";
[...]

如果您需要更多信息,请告诉我! 我希望有人知道是什么导致了这个问题!

【问题讨论】:

  • 你试过trim()吗?

标签: javascript php jquery ajax


【解决方案1】:

你可以试试JSON.parse。如果值在控制台上看起来像 "LOCKED",则表示它像 ""LOCKED""。

编辑 1

正如评论的那样,您将"\r\nLOCKED" 作为字符串化值,因此您可以使用正则表达式来替换它。以下是更新后的代码。

Reference - How to remove all line breaks from a string?

样本

var a = "LOCKED";
var strA = "\r\nLOCKED";
var regex = /\r?\n|\r/g;
var cleanStr = strA.replace(regex,'');
console.log(a);
console.log(strA);

console.log(strA == a);
console.log(cleanStr == a);

【讨论】:

  • 让我更接近结果:使用字符串化它返回:“\r\nLOCKED”
  • 会从我这里得到第二个 +1,但是,你是对的,它正在解决问题(但是,这会导致另一个问题)。如果我找不到第一个错误,我会接受那个答案,非常感谢!
  • 理想情况下,您应该找出为什么会从服务器收到这样的结果并以正确的格式发送。
【解决方案2】:

可能是由于某处出现空白,例如打开 php 标记之前的空格等。

最好使用像 json 这样的结构化数据格式,并返回一个布尔属性以避免这些问题:

$result = $lih -> check($_POST["user"], $_POST["password"]);
$locked = ($result == 'LOCKED');
header('Content-Type: application/json');
echo json_encode(['locked'=>$locked]);

Javascript:

if(data.locked){ 

【讨论】:

    【解决方案3】:

    一定是因为一些空格或换行,最好修剪data。试试这个:

    if (data.trim() == "LOCKED") {
    

    你也可以使用:

    if ($.trim(data) == "LOCKED") { // using jQuery.
    

    【讨论】:

    • 都试过了,还是返回false。
    • @Y.Hermes 你能告诉console.log(encodeURIComponent(data));的价值吗?
    • 不知道这是什么意思:D %0D%0Astring(6)%20%22LOCKED%22%0ALOCKED
    • 哇...您还有其他东西正在返回。人!!!您以"LOCKED" 的身份返回。哟!!您需要与'"LOCKED"' 进行比较。大声笑。
    • @Y.Hermes 请出示截图并将其放在您的帖子中。看起来你正在输出一些疯狂的东西。 :)
    猜你喜欢
    • 2016-12-18
    • 2011-11-14
    • 2019-10-06
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多