【问题标题】:Javascript confirm() function cannot pass parameters properlyJavascript confirm() 函数无法正确传递参数
【发布时间】:2013-02-25 23:21:28
【问题描述】:

我正在使用 PHP 和 JavaScript,但在处理 JavaScript 中的 confirm() 函数时遇到了问题。

假设我有一个页面add.php,首先我收到一些从另一个页面传递过来的参数,然后我检查它们是否有效。如果是,我只是将数据插入db并返回另一个页面,如果它们无效,则会弹出一个confirm()窗口,让用户选择是否继续。如果用户仍然选择继续,我希望重新加载页面并再次发送所有参数。但问题是我第二次加载add.php时无法获取参数。

以前我没有使用window.onload 函数和confirm() 弹出窗口,而是使用< a href> 链接,一切正常(请参阅末尾的附加代码)。但是当我尝试使用以下代码时,相同的 url 停止工作

echo "<script type=\"text/javascript\">";
echo "window.onload = function() {
    var v = confirm(\"$name is not alive, do you want to add it into system?\");
    if (v) {
        window.location.href= \"add.php?type=room&amp;name=$name&amp;area\"
            + \"=$area&amp;description=$description&amp;\"
            + \"capacity=$capacity&amp;confirm=Y\";
    } else {
        window.location.href= \"admin.php?area=$area\";
    }
}";
echo "</script>";

以下是以前的版本,我没有使用window.onload(),而是使用&lt; a href="..." /&gt;链接,当时一切正常。 get_form_var是functions.inc中的一个函数,就是使用$_GET数组来获取参数。

<?php
    require_once "functions.inc";
    // Get non-standard form variables
    $name = get_form_var('name', 'string');
    $description = get_form_var('description', 'string');
    $capacity = get_form_var('capacity', 'string');
    $type = get_form_var('type', 'string');
    $confirm = get_form_var('confirm','string');

    $error = '';

    // First of all check that we've got an area or room name
    if (!isset($name) || ($name === ''))
    {
        $error = "empty_name";
        $returl = "admin.php?area=$area" 
                . (!empty($error) ? "&error=$error" : "");
        header("Location: $returl");
    } 

    // we need to do different things depending on if its a room
    // or an area
    elseif ($type == "area")
    {
        $area = mrbsAddArea($name, $error);
        $returl = "admin.php?area=$area" 
                . (!empty($error) ? "&error=$error" : "");
        header("Location: $returl");
    }

    elseif ($type == "room")
    {
        if (isset($confirm)){
            $dca_osi = getOsiVersion($name);
            $room = mrbsAddRoom(
                $name, 
                $area, 
                $error, 
                $description, 
                $capacity,
                $dca_osi,
                1
            );
            $returl = "admin.php?area=$area" 
                    . (!empty($error) ? "&error=$error" : "");
            header("Location:$returl");
        }
        else {
            $dca_status= pingAddress($name);
            $dca_osi = getOsiVersion($name);
            if( $dca_status == 0){ 
                $room = mrbsAddRoom(
                    $name, 
                    $area, 
                    $error, 
                    $description, 
                    $capacity,
                    $dca_osi,
                    0
                );
                $returl = "admin.php?area=$area" 
                        . (!empty($error) ? "&error=$error" : "");
                header("Location:$returl");
            }
            else {
                print_header(
                    $day, 
                    $month, 
                    $year, 
                    $area, 
                    isset($room) ? $room : ""
                );
                echo "<div id=\"del_room_confirm\">\n";
                echo "<p>\n";
                echo "$name is not alive, are you sure to add it into system?";
                echo "\n</p>\n";
                echo "<div id=\"del_room_confirm_links\">\n";
                echo "<a href=\"add.php?type=room&amp;name"
                     . "=$name&amp;area=$area&amp;description"
                     . "=$description&amp;capacity=$capacity&amp;confirm"
                     . "=Y\"><span id=\"del_yes\">" 
                     . get_vocab("YES") . "!</span></a>\n";
                echo "<a href=\"admin.php?area=$area\"><span id=\"del_no\">" 
                     . get_vocab("NO") . "!</span></a>\n";
                echo "</div>\n";
                echo "</div>\n";
            }
        }
    }

    function pingAddress($host)
    {
        $pingresult = exec("/bin/ping -c 1 $host", $outcome, $status);
        if ($status==0) {
            return $status;
        }
        else {
            return 1;
        }
    } 

    function getOsiVersion($host)
    {
        $community = 'public';
        $oid = '.1.3.6.1.4.1.1139.23.1.1.2.4';
        $sysdesc = exec("snmpwalk -v 2c -c $community $host $oid");
        $start = strpos($sysdesc, '"');
        if ($start!==false) {
            $sysdesc = substr($sysdesc, $start+1,$sysdesc.length-1);
            return $sysdesc;
        }
        else {
            return "not available";
        }
    }

【问题讨论】:

  • 那个 Javascript 在什么文件中? add.php?
  • 我注意到原始版本和 JS 版本之间的一个区别是,在 JS 版本中,您没有将 confirm=Y 作为 URL 的一部分传递。我不确定这是否是问题所在......
  • 这可能是一个需要在任何情况下纠正的错误,否则您的页面似乎会一遍又一遍地通过确认对话框重新加载。
  • javascript 在 add.php 中。对 JS 中的 url 链接感到抱歉,只是把它改回来了,即使在 HTML 中工作的相同 url 在 JS 中也不起作用。
  • 对话框不会一次又一次地加载,因为一旦在确认窗口点击“确定”,add.php 将被重新加载但它无法接收$name 的值,因此它会生成一个错误并返回到 admin.php。

标签: php javascript window


【解决方案1】:

我已经解决了这个问题,只需使用“&”而不是“& amp;”在 url 链接中...现在可以正常工作了...

【讨论】:

  • 很高兴你知道了。我认为&符号是不必要的,但没有发表评论,因为我认为它们不会引起问题......现在我们知道了!我认为在使用 XHTML 时,只有属性需要在 URLs 内,除非您对 XHTML 有特殊需要,否则我建议您只使用常规 HTML。
  • 仅供参考,如果您的任何变量($name 等)包含引号,则您的代码在原始版本中将无效并且在 JS 版本中将失败。我猜在这种情况下这是不可能的,但为了将来参考,您可能需要查看urlencode 或更好(在这种情况下)http_build_query
  • 感谢您指出这一点 :) 我会研究一下。 Aucatlly,我仍然不知道为什么 & 符号不起作用,因为我在其他 php 页面中做了同样的事情......
  • 您的其他页面也使用 Javascript 重定向?在 PHP 中应该没问题,但在 Javascript 中,与号肯定会出现问题 - 尝试从 Firebug 中的 Javascript 控制台运行它,例如:location.href='http://localhost/test.php?a=1&amp;amp;b=2'(其中 localhost/test.php 仅包含 var_dump($_GET);
【解决方案2】:

你试试 location.reload() javascript 调用?

【讨论】:

  • 嗨 Ryan,我已经尝试过 location.reload() 但似乎我仍然无法获取参数的值。
  • 您是否使用$_GET 全局数组来初始化您的var $name$description$type? URL 中的所有 var 都可以在 $_GET 中检索(在您的 PHP 代码中,而不是在 javascript 中!)
  • 是的,第一次加载add.php,所有参数的值都可以得到,没有任何问题,只有当我尝试通过确认窗口重新加载页面时,我无法再次传递值.
  • 嗨 Ryan 和 Matt,请查看更新的内容,我已经添加了整个页面的代码。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多