0

真的找不到任何有效的解决方案来解决这个问题。

我在一个 php 页面中有一个警报,该页面正在由 AJAX 加载。警报不起作用。为什么?

<!DOCTYPE html>
<html>
    <head>
        <script>
            alert('test');
        </script>
    </head>

    <body>
        <?php
            $from = $_REQUEST['from'];
            $to = $_REQUEST['to'];
            $amount_per_day = 100;

            $hoursDiff = ( strtotime($to) - strtotime($from) )/(60 * 60) / 24;

            $final_amount = $amount_per_day * ($hoursDiff + 1);

            if($final_amount < 1900 && $final_amount > 0) {
                echo $final_amount . ".00 GBP";
            }
            else if($final_amount < 0) {
                echo "Days cannot overlap";
            }
            else {
                echo '0.00 GBP';
            }
        ?>
    </body>
</html>
4

3 回答 3

1

将您的代码简化为更简单的版本:

<head>
  <script>
    alert('test');
  </script>
</head>

这是被拉入并(我假设)附加到现有内容,而不是直接在浏览器中运行。浏览器将适当地呈现所有标签,但不幸的是它不会运行该内容中包含的任何脚本。

我注意到您在 PHP 中包含内容,因此可以肯定地说,该内容是您想要返回的内容,并且(如果无效)放入alert(). 如果您使用 jQuery 的 AJAX 方法,您可以在该.success()方法中编写代码;作为一个快速而肮脏的指针,您需要编写类似于以下内容的代码:

$.ajax (url, {
  data: { from: $("#from").val(), to: $("#from").val() },
  success: function(data) {
    if (!data.isValid) {
        alert (data.message);
    } else {
        $("#amount").val(data.amount);
    }
  }
);

然后让您的 PHP 返回如下结构:

<xml>
    <isValid>true</isValid>
    <message>My message here!</message>
    <amount>60.00</amount>
</xml>
于 2013-08-21T13:01:55.533 回答
0

假设您在 ajax 接收到该<script>标记后将其写入页面,则 javascript 解释器不会解析该标记。

您需要做的是找到响应中的所有脚本标签eval()及其内容,如下所示:

var newContent = /* ajax response */;
var dummy_el = document.createElement( 'div' );

dummy_el.innerHTML = newContent;

var scripts = dummy_el.getElementsByTagName( 'script' );

for ( var i = 0; i < scripts.length; i++ ) {

  eval( scripts[ i ].innerHTML );

}

/* write newContent to page */
于 2013-08-21T13:00:56.447 回答
0

如果您通过 jQuery AJAX 方法加载页面,请不要在页面输出中包含<html>,<head><body>标签,因此 PHP 页面仅输出

<script>
   alert('test');
</script>
<?php
   $from = $_REQUEST['from'];
   $to = $_REQUEST['to'];
   $amount_per_day = 100;

   $hoursDiff = ( strtotime($to) - strtotime($from) )/(60 * 60) / 24;

   $final_amount = $amount_per_day * ($hoursDiff + 1);

   if($final_amount < 1900 && $final_amount > 0) {
       echo $final_amount . ".00 GBP";
   }
   else if($final_amount < 0) {
       echo "Days cannot overlap";
   }
   else {
       echo '0.00 GBP';
   }
?>

如果您通过 AJAX 和浏览器中的页面使用 PHP,则将 AJAX 输出和 HTML 输出放在 if 子句中,以便 AJAX 获得基本代码,浏览获得完整的 HTML。

<?php if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { ?>
  <!-- basic ajax response -->
<?php } else { ?>
  <!-- full html response include <html><head><body> -->
<?php } ?>
于 2013-08-21T13:13:58.460 回答