自定义错误 XPage:浏览器加载和执行 JS 脚本 Link 或加载错误后阻止的能力

Custom Error XPage: Ability for Browser to Load and Execute JS Script Link or Block After Being Loaded On Error

情况

我正在使用自定义错误 XPage,高度偏离 the XSnippet from Tony McGuckin. It works rather well but I would like for the browser to execute a client-side JavaScript block (or load and run a JS file from a given URL). If I navigate directly to the custom error XPage, it loads correctly, but given the nature of how it loads on redirect from a SSJS runtime error, it seems to load any attempts at loading a script block in the head tag, inside the body tag. I've attempted passing through a JS script tag in the body (shown in the code below), attempted using the xp:headTag inside xp:resources, and attempted via an xp:script tag in xp:resources

浏览器视角

从浏览器的角度来看,在部分刷新期间调用 SSJS 的事件期间遇到 运行 时间错误后,xhr 被调用 returns 500 并将内容设置到正文中标记(屏幕截图)。

查看响应内容时,整个自定义错误 XPage 都在那里,包括 <script type="text/javascript">console.log("hello world");<script>。这似乎不会触发或向浏览器的 JS 控制台输出任何内容。通过 JS 控制台可见的是来自 dojo 的一些垃圾,抱怨返回一个响应代码为 500 的 XHR(我的 dojoConfig 通过 xsp.client.script.dojo.djConfig 设置为 isDebug: true在 XSP 属性中)。

问题

在加载自定义错误 XPage 期间发生错误 500 后,是否有办法让客户端 JS 脚本标记在浏览器中加载和执行?


这是我的错误页面的代码。要重现我的结果,调用一个 SSJS 操作导致 运行 时间错误(例如 Paul Withers 的 OpenLog Logger for XPages 项目中包含的 ErrorOnClick XPage)和部分刷新事件。

Error.xsp(在XSP Properties中设置为错误页面)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.ibm.com/xsp/core xsdxp://localhost/xsp~core.xsd"
    pageTitle="${javascript:database.getTitle() + ' | Error'}">
    <style
        type="text/css"><![CDATA[
        body {
            background-color: lightblue;
        }
        form {
            width: 1000px !important;
            margin: 0 auto !important;
            background-color: white !important;
            margin-top: 2rem !important;
            padding: 0.5rem !important;
            height: auto;
        }
        .xspTextLabel {
            font-weight: bold !important;
        }
  ]]></style>
    <img
        class="logo-simple"
        src="//placehold.it/124x32" />
    <xp:panel>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:label
            style="font-weight:bold;font-size:12pt"
            value="An Unexpected Error Has Occurred:">
        </xp:label>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:label
            value="Error:"></xp:label>
        <xp:br />
        <xp:text
            escape="false">
            <xp:this.value><![CDATA[#{javascript:if( !!requestScope.error ){
    var output = (requestScope.error.toString() || null)+"<br /><br />";
    if(requestScope.error instanceof com.ibm.xsp.exception.XSPExceptionInfo){
        var codeSnippet = requestScope.error.getErrorText(); 
        var control = requestScope.error.getErrorComponentId();
        var cause = requestScope.error.getCause();
        output += "In the control : " + control + "<br /><br />";
        if(cause instanceof com.ibm.jscript.InterpretException){
            var errorLine = cause.getErrorLine();
            var errorColumn = cause.getErrorCol();
            output += "At line " + errorLine;
            output += ", column " + errorColumn + " of:<br />";
        }else{
            output += "In the script:<br />";
        }
        if( @Contains(codeSnippet,"#{javascript:") ){
            var snipAr = codeSnippet.split("#{javascript:");
            var tmpSnip = snipAr[1];
            var nwSnip = tmpSnip.substring(0, tmpSnip.length - 1);
            output += "#{javascript:<br /><pre>"+nwSnip+"</pre>}"
        }else{
            output += codeSnippet;
        }
    }
    return output;
}else{
    return "";
}}]]></xp:this.value>
        </xp:text>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:label
            value="Stack Trace:"></xp:label>
        <xp:br />
        <xp:text
            escape="false"
            style="font-size:10pt">
            <xp:this.value><![CDATA[#{javascript:if( !!requestScope.error ){
    var stackTrace = "";
    var trace = (requestScope.error.getStackTrace() || null);
    if(trace != null){
        for(var i = 0; i < trace.length; i++){
            stackTrace += trace[i] + "<br/>";
        }
        return "<pre>"+stackTrace+"</pre>";
    }else{
        return "nothing";
    }
}else{
    return "";
}}]]></xp:this.value>
        </xp:text>
    </xp:panel>
    <script
        type="text/javscript">
        <![CDATA[console.log("Hello world...");]]>
    </script>
</xp:view>

它的价值:我没有通过搜索 Google 或 Whosebug 找到任何关于这个主题的明确内容。


更新 1: 这是一个咖啡因缺乏或只是没有通过树木看到森林的情况。在您的 HTML 代码中不使用 CDATA 块会有所帮助。我这个懒惰的开发人员尝试在 xp:script 块和 HTML