第2部分:将变量从javascript传递到applescript

第2部分:将变量从javascript传递到applescript,javascript,applescript,Javascript,Applescript,我正在尝试自动解析网站(安全),并使用预填充的信息设置word文档。我考虑了3个步骤: 从页面提取信息(我不控制它和它的动态生成) 将此信息从safari传递到applescript 使用“搜索并替换为我的模板” 我得到了第一个PAR,提取脚本也起作用了。我需要附加jquery(站点不使用它),我知道我调用并附加了两次,但我不知道如何将一个参数从javascript传递到applescript,更不用说2 无论如何,我的问题是我在applescript中得到了空变量,但是javascript部分

我正在尝试自动解析网站(安全),并使用预填充的信息设置word文档。我考虑了3个步骤:

  • 从页面提取信息(我不控制它和它的动态生成)
  • 将此信息从safari传递到applescript
  • 使用“搜索并替换为我的模板”
  • 我得到了第一个PAR,提取脚本也起作用了。我需要附加jquery(站点不使用它),我知道我调用并附加了两次,但我不知道如何将一个参数从javascript传递到applescript,更不用说2

    无论如何,我的问题是我在applescript中得到了空变量,但是javascript部分工作得很好(我测试过,它得到了正确的值)

    感谢您提供有关如何获取findMe返回到applescript变量的javascript值的任何提示,如果您还可以让我知道如何将脚本简化为一个带有2个参数的调用,那也太棒了

    to getClaimFile(needle)
    
    tell application "Safari"
        set input to do JavaScript "
    
    
        (function () {
    
                function loadScript(url, callback) {
    
                var script = document.createElement('script')
             script.type = 'text/javascript';
    
            if (script.readyState) { //IE
                    script.onreadystatechange = function () {
                     if (script.readyState == 'loaded' || script.readyState == 'complete') {
                                 script.onreadystatechange = null;
                                findMe('" & needle & "')
                        }
                    };
            } else { //Others
            script.onload = function () {
        findMe('" & needle & "')
            };
        }
    
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
    }
    
    loadScript('https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js',     function () {
    
         //jQuery loaded
         console.log('jquery loaded');
    
    });
    
    })();
    
    
    
    
    
    function findMe(squery) {
    
            return $('iframe#app_win').contents().find('iframe#app_subwin').contents().find('label:contains('+squery+')').parent().next('td').text()
    }
    " in current tab of window 1
    end tell
    return input
    
    end getClaimFile
    
    set claimNum to getClaimFile("Claim #:")
    set fileNum to getClaimFile("File Number:")
    log claimNum
    log fileNum
    

    在AppleScript中返回值很时髦。您没有像在JavaScript中那样指定“return”语句;相反,语句中的最后一个变量只是按原样返回

    以下是您尝试执行的操作的简化版本:

  • 创建一个执行JavaScript并返回值的函数
  • 获取函数的返回值并在AppleScript中使用它


  • 如果在访问StackOverflow页面时运行此测试,则第一个测试(
    myrealtag
    )将返回第一个元素的名称,该元素的类为页面上的
    .post标记。第二个测试(
    foobar
    )使用在页面上找不到的搜索字符串,因此将返回“not found in JS”(如上面的JS代码段所示)

    这里有一小串的返回值在起作用。
    getTagName
    AppleScript函数配置为返回
    myreturnvalue
    myreturnvalue
    是一个由JavaScript填充的变量。JavaScript被配置为返回
    标记的值

    to getTagName(searchterm)
    
        tell application "Safari"
            set myreturnvalue to do JavaScript "
            var tags = document.querySelectorAll('." & searchterm & "');
            var tag = (tags.length) ? tags[0].innerHTML : 'not found in JS'; 
            tag; " in tab 1 of window 1
        end tell
    
    myreturnvalue
    
    end getTagName
    
    set myrealtag to getTagName("post-tag")
    log myrealtag
    
    set myfaketag to getTagName("foobar")
    log myfaketag