javascript - 在开发中,输出故障排除代码仅适用于标准页面加载,ajax 存在问题
问题描述
摘要:我有一个解决方案,用于在我的环境中监视变量和代码处理。它适用于静态页面,下面的代码是一个可用的解决方案。但是,如果页面包含在页面运行后更新公共变量的 ajax 调用,则此监视方法没有用处。为了做到这一点,我想找到一种方法来搭载一个 ajax 调用,该调用将在适当的位置运行故事信息,但我不知道如何将它用于此代码。
我在开发环境中使用了以下 php 错误检查文件,以下使用魔术函数 register_tick_function 将代码存储为运行并显示每个步骤的变量。将其包含在页面上可以运行滴答过程......
<?php
register_tick_function(function(){
if (isset($GLOBALS["developer_debug"]) && $GLOBALS["developer_debug"] == 'active'){
$backtrace = debug_backtrace();
$line = $backtrace[0]['line'] - 1;
$file = $backtrace[0]['file'];
if ($file == __FILE__) return;
static $fp, $cur, $buf;
if (!isset($fp[$file])) {
$fp[$file] = fopen($file, 'r');
$cur[$file] = 0;
}
if (isset($buf[$file][$line])) {
$code = $buf[$file][$line];
} else {
do {
$code = fgets($fp[$file]);
$buf[$file][$cur[$file]] = $code;
} while (++$cur[$file] <= $line);
}
$line++;
if (defined('ERR_LOG')){ $error_log = ERR_LOG; } else {
$error_log = "../logs/error_log";
}
error_log("\n==========================================================\n", 3, $error_log);
error_log("\n $file : $line :: $code \n", 3, $error_log);
error_log("\n Variables: \n" . print_r(get_defined_vars(), true) . "\n", 3, $error_log);
$GLOBALS["_TROUBLESHOOTING"][] = "<code>\n $file : $line ::: ". htmlentities($code, ENT_QUOTES) . " \n</code>";
}
}, ["_SERVER" => $_SERVER, "_COOKIE"=>$_COOKIE, "_REQUEST"=>$_REQUEST, "_SESSION"=>$_SESSION, "_GLOBALS"=>$GLOBALS]);
// To use...
// declare(ticks=1);
// include_once('debug.php');
在我的直接页面加载(例如 index.php)中,我可以包含这个 js:
$(document).ready(function() {
var dev_top_button = document.createElement("Button");
dev_top_button.innerHTML = "Top Dev Data";
dev_top_button.style = "top:0;right:75%;position:absolute;z-index: 9999"
document.body.appendChild(dev_top_button);
var dev_bottom_button = document.createElement("Button");
dev_bottom_button.innerHTML = "Bottom Dev Data";
dev_bottom_button.style = "top:0;right:50%;position:absolute;z-index: 9999"
document.body.appendChild(dev_bottom_button);
$(dev_top_button).click(function(){
$("#debug_top").toggle();
});
$(dev_bottom_button).click(function(){
$("#debug_bottom").toggle();
});
});
这在页面本身上:
echo "<div class='debug_outer' id='debug_top'><h3>Developer Information</h3><div class='debug_inner'><pre>";
if (isset($GLOBALS['_TROUBLESHOOTING']) && is_array($GLOBALS['_TROUBLESHOOTING']) && ! empty($GLOBALS['_TROUBLESHOOTING'])) {
$troubleshooting_return_array = $GLOBALS['_TROUBLESHOOTING'];
} else {
$troubleshooting_return_array = ['Empty'];
}
echo print_r(["_COOKIE" => $_COOKIE, "_REQUEST" => $_REQUEST, "_SESSION" => $_SESSION, "_TROUBLESHOOTING" => $troubleshooting_return_array, "_SERVER" => $_SERVER, "_GLOBALS" => $GLOBALS], true);
echo '</pre></div></div>';
(以及页面末尾的类似输出)
因此,对于大多数页面,这种快速检查页面变量的方法效果很好。并生成一个漂亮的 javascript 按钮,我可以在其中快速检查页面上的开始和结束变量,以及 _TROUBLESHOOTING 数组,我可以轻松转储任何我想要快速查看页面开始和结束的值。
所以这个系统对我来说已经运行了很长一段时间了。然而,问题来自 ajax 调用。我尝试了几种不同的方法,但 ajax 调用通常需要并期望某种格式的数据。我想要制作第三个 div 来显示数据以及一个按钮,但是我很难弄清楚如何将任何输出数据与 ajax 调用一起搭载,并且必须调用它当调用 ajax 以了解所有变量如何变化并跟踪我正在排除的任何问题时。当然,我每次都可以将输出输出到错误日志中,但这在工作流程上速度较慢,并且需要从上次清除日志以来的所有输出中查找,而不是在我操作时简单地查看我的数据是什么。
有没有人有一个好主意可以利用 ajax 调用来利用这些现有类型的调用?因为弄乱 ajax 调用的返回值总是会导致 ajax 调用本身的错误数据。
解决方案
在我考虑了一段时间后,解决方案相当简单:
对于ajax请求,将数据发送到会话中的子数组;一个子数组,通常被正常的两个打印输出忽略。然后,有第三个按钮,它是一个 ajax 请求,专门获取该子数组的值。子数组可以专门为每一个已经完成的ajax调用填充一个子数组,然后当被第三个按钮获取时,它创建一个div来共享它然后清空子数组(否则它会膨胀太快),允许查看自上次单击按钮以来的所有 ajax 调用(并将它们附加到现有列表中,如果仍在同一页面上。)
推荐阅读
- powershell - Windows PowerShell 变量中的空格无法继续
- dask - 如何在 dask 数据框中弹出一列?
- flutter - 如何在 Flutter 中将可点击按钮添加到 DropdownMenuItem?
- elasticsearch - Kubernetes 上的 Elasticsearch - 最佳实践
- machine-learning - 机器学习分类
- selenium - Seleniumlibrary 命令不适用于 Ride?
- google-apps-script - Google 表格脚本 - 通过生成的值范围减少单元格的值
- android - 自定义信息窗口中的阴影
- jenkins - 如何在 Jenkins 中使用 groovy 脚本仅获取过去 24 小时的成功构建?
- c# - UICollectionview - 删除右填充/边距?