【问题标题】:PHP + Javascript parent function not getting calledPHP + Javascript父函数没有被调用
【发布时间】:2012-02-02 07:02:35
【问题描述】:

好吧,我已经尝试找到这个问题的答案已经好几个小时了,但我自己无法解决。 我正在尝试从 PHP 函数调用 Javascript 父函数,但是它没有被调用。 当使用 onclick 方法 onclick='parent.dosomething(); 时,一切似乎都可以正常工作,但如果我尝试通过回显来调用该函数,它会由于某种原因而失败。

echo "<script>parent.reloadprofmessages();</script>"; //this is what is not getting called

这是 PHP 函数:

function checkactivity($username)
{
    //These are just queries being executed (irrelevant)

    $querystats = "SELECT users.fullname, activity.id, activity.sender, activity.receiver, activity.type, activity.dateposted, activity.seen, activity.related FROM activity, users WHERE activity.receiver = '$username' && activity.seen = '0' ORDER BY id DESC LIMIT 1";
    $resultstats = mysql_query($querystats);
    $num_stats = mysql_num_rows($resultstats);
    $rowactivity = mysql_fetch_assoc($resultstats);

    //End of queries

    if($num_stats > 0) //If there are registries
    {
        $user = $_SESSION['Username'];

        $activity_date = $rowactivity["dateposted"];
        $activity_type = $rowactivity["type"];
        $activity_sender = $rowactivity["sender"];
        $timeactivity = strtotime( "$activity_date" );
        $actualtime = time();

        $timetoseconds = $actualtime - $timeposted; 
        $timetominutes = floor($timepassedtoseconds/60);

        if($timetominutes < 2)
        {
            if($activity_sender != $user)
            {
                if($activity_type == 1) //Messages
                {
                    echo "<script>parent.reloadprofmessages();</script>"; //this is what is not getting called
                }
            }
        }

    }
}

这是我在父页面上的 Javascript 函数:

function reloadprofmessages()
{
    $('#friendrequests').load('showprofmessages.php?username=<?php echo $actualuser; ?>').fadeIn("slow");
} //refreshes messages

我在 Google Chrome 中按 CTRL + Shift + I 进入开发人员工具,网络 > 执行调用 PHP 函数的请求的页面 > 预览,这就是我收到的内容: &lt;script&gt;parent.reloadprofmessages();&lt;/script&gt; 但是,该函数没有被调用。 解决这个问题会解决我很多问题,对我来说,知道为什么它不起作用实际上仍然是一个谜,因为它在其他情况下也有效。 提前感谢您的帮助。

【问题讨论】:

  • 我不会尝试使用这种通过 php 调用 javascript 的方法。如果你需要多次调用这个 js 方法会发生什么?你不想一直回显

标签: php javascript jquery function parent


【解决方案1】:

获取 javascript 并使用 AJAX 执行它不是一个好主意。我的建议是首先将您的 PHP 更改为:

if($activity_type == 1) //Messages
{
    echo "1";
}
else {
    echo "0";
}

然后将您的 Javascript 更改为:

function reloadprofmessages()
{
    var can_reload = $.ajax({ url: "showprofmessages.php?username=<?php echo $actualuser; ?>" });
    if (can_reload) {
        parent.erloadprofmessages();
    }
}

希望有帮助

【讨论】:

  • 我会试试那个方法,然后告诉你发生了什么,谢谢。
  • 你看,仅仅因为你获取一些脚本标签并将它们插入到DOM中,并不意味着它们里面的javascript就会被执行。实际上,作为安全预防措施,在某些情况下故意禁用此功能。最好使用 ajax 查询来获取一个值,然后由预加载的 javascript 使用该值来执行操作,如上例所示。
  • 谢谢,但它似乎仍然不起作用,我想这是因为 reloadprofmessages() 没有从任何地方被调用,这意味着我仍然必须调用它。我这样做的原因是因为我可以通过不回显大量文本来节省带宽。 (通过打电话等方式减少回显文本)
  • 好的,但是 parent.reloadprofmessages() 正在由子脚本中的 javascript 调用。所以基本上,你正在调用你的 php,它返回 1 或 0 并将其存储到 can_reload 中。如果 can_reload 为 1,那么您调用 parent.reloadprofmessages().... 哦,请注意我在上面的回答中拼写错误的函数。
  • 在工作和阅读之后,我发现我尝试的东西出了什么问题,我有点使用你的例子,但决定使用 $ajax.get() 代替。我会在下面详细解释。 (回答我的问题)
【解决方案2】:

为脚本标签添加类型属性

echo "<script type='text/javascript' >parent.reloadprofmessages();</script>"; 

记得在这一行之前定义javascript函数

【讨论】:

    【解决方案3】:

    所以这是错误的:(显示错误)

    function checkactivity($username)
    {
        //These are just queries being executed (irrelevant)
    
        $querystats = "SELECT users.fullname, activity.id, activity.sender, activity.receiver, activity.type, activity.dateposted, activity.seen, activity.related FROM activity, users WHERE activity.receiver = '$username' && activity.seen = '0' ORDER BY id DESC LIMIT 1";
        $resultstats = mysql_query($querystats);
        $num_stats = mysql_num_rows($resultstats);
        $rowactivity = mysql_fetch_assoc($resultstats);
    
        //End of queries
    
        if($num_stats > 0) //If there are registries
        {
            $user = $_SESSION['Username'];
    
            $activity_date = $rowactivity["dateposted"];
            $activity_type = $rowactivity["type"];
            $activity_sender = $rowactivity["sender"];
            $timeactivity = strtotime( "$activity_date" ); //$timeactivity was not being used
            $actualtime = time();
    
            $timetoseconds = $actualtime - $timeposted; //$timeposted doesn't even exist, in other words I wasn't even converting the $activity_date timestamp to time.
            $timetominutes = floor($timepassedtoseconds/60);
    
            if($timetominutes < 2)
            {
                if($activity_sender != $user)
                {
                    if($activity_type == 1) //Messages
                    {
                        echo "<script>parent.reloadprofmessages();</script>"; //this was not the correct way of calling a function from the parent page.
                    }
                }
            }
    
        }
    }
    

    关于Javascript函数: 这就是我的结尾:

    var auto_refresh = setInterval(
    function reloadstring()
    {
            $.get("checknewactivity.php?vprofile=<?php echo $actualuser; ?>", function(activity){
            if (activity == 1) 
            {
                $('#profcommentsdiv').load('showprofmessages.php?vprofile=<?php echo $actualuser; ?>').fadeIn("slow");
            }
            });
    }, 1000); // refresh every 1000 milliseconds
    

    现在它可以工作了,谢谢你的帮助,我真的很感激,而且像往常一样,在这里询问后我总是会得到一个更安全的解决方案。

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      相关资源
      最近更新 更多