在“do JavaScript”之后,我的AppleScript变量变为未定义

x8diyxa7  于 2023-02-15  发布在  Java
关注(0)|答案(2)|浏览(143)

我已经在脚本的顶部声明了全局变量,并且初始化了它们。
我可以将do JavaScript设置为变量emptyDue,但当我试图将JavaScript的结果与变量serviceDate进行比较时,我得到

错误“未定义变量emptyDue。”编号-2753来自“emptyDue”

为什么我可以在一行上赋值emptyDue,然后在下一行上,它突然忘记它应该存在?

global emptyDue, serviceDate
set emptyDue to ""
set serviceDate to "2021-11-30"

on isEmptyDue()
    
    tell application "Safari" to tell document 1
        
        set emptyDue to do JavaScript "document.getElementById('trgUseNext').click();
 document.getElementById('trgUseNext').value; --gets the date value from a webpage."
        
        if emptyDue < serviceDate then
            display dialog "TRUE"
        else
            display dialog "FALSE"
        end if
        
    end tell
    
end isEmptyDue

isEmptyDue()
log emptyDue
q7solyqu

q7solyqu1#

AppleScript的设计中存在一个已知缺陷:一个命令可能不返回任何值。2如果你把这个命令的结果绑定到一个变量上,它实际上使这个变量成为未定义的。
您可以通过确保命令 * 总是 * 返回一个值来避免-2753错误,即使该值只是一个空字符串。

rqqzpn5f

rqqzpn5f2#

这是一个已知的AppleScript bug,正如用户foo对这个问题的回答所指出的。下面是一个小代码片段,可以帮助其他人解决同样的问题:

on tryJavaScript(js)
    set outVal to ""
    set tried to 0
    set js to "try{" & js & "}catch{null};"
    
    tell application "Safari"
        
        tell current tab of first window to repeat
            set outVal to do JavaScript js
            try
                set working_around_error_2753 to outVal
            on error number -2753
                set outVal to "not found"
            end try

            if outVal is not "null" then exit repeat
            delay 0.1
            set tried to tried + 1
            if (tried > 5) then return "unrecoverable"
        end repeat
        
    end tell
    return outVal
end tryJavaScript

可以使用以下语法调用此处理程序:

set emptyDue to tryJavaScript("document.getElementById('trgUseNext').click();
 document.getElementById('trgUseNext').value;")

这并不能保证您的JavaScript能够正常工作,但至少可以给予一个更有意义的错误消息。

相关问题