Как получить доступ к элементам через фреймы?

file1.HTML-код

<html>
<head>
<title>AIDS (Automated ID System)</title>
<HTA:APPLICATION 
    id="frames" 
    border="thin" 
    caption="yes" 
    icon="http://www.google.com/favicon.ico" 
    showintaskbar="yes" 
    singleinstance="yes" 
    sysmenu="yes" 
    navigable="yes" 
    contextmenu="no" 
    innerborder="no" 
    scroll="auto" 
    scrollflat="yes" 
    selection="yes" 
    windowstate="normal" />

<script language="javascript" type="text/javascript">

    function pausecomp(millis) 
    { 
        var date = new Date(); 
        var curDate = null; 
        do { curDate = new Date(); } 
        while(curDate-date < millis); 
    } 

    function getWindowsUserName()
    {
        var WinNetwork = new ActiveXObject("WScript.Network");
        var urlToSite = createCustomURL(WinNetwork.UserName);
        var frame = document.getElementById("psyncLink"); 
        frame.onload = function() { 
            frame.onload = null; 
            if (requestingPassword()) { 
                //alert("password button screen");
                passwordButtonScreen();
            } else { 
                alert("direct password required"); 
            } 
        } 
        frame.src = urlToSite;
    }

    function requestingPassword()
    {       
        var btn = window.frames[1].document.getElementsByName("SUBMIT-password.pss");
        if (btn.length == 0) {
            return false;
        } else {
            return true;
        }
    }

    function passwordButtonScreen()
    {       
        var btn = window.frames[1].document.getElementsByName("SUBMIT-password.pss");       
        btn[0].click();     
    }

    function createCustomURL(userName)
    {
        var customURL = "http://localhost/nph-psf.exe?HOSTID=AD&ALIAS=" + userName;
        return customURL;
    }

    function Sleep(milliseconds) {
        var start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
            if ((new Date().getTime() - start) > milliseconds){
                break;
            }
        }
    }

    function whichScreen() { 
        var btn = window.frames[1].document.getElementsByName("SUBMIT-password.pss"); 
        if (btn.length == 0) { 
            alert("no button!"); 
            // User is at password screen
            var textField = window.frames[1].document.getElementsByName("_MYPW");
            textField[0].text = "";
            return; 
        } else { 
            btn[0].click();
            WaitSeconds(5);
            var textField = window.frames[1].document.getElementsByName("_MYPW");
            textField[0].value = "ios12sdk";
            btn = window.frames[1].document.getElementsByName("SUBMIT-VERIFY");
            btn[0].click();
        }
    }

    var loadOtherFrame = function (text) { 
        getWindowsUserName(); 
        alert(text);
    };

</script>

    </head>     
    <frameset cols="300px, *"> 
        <frame src="leftframe.html" name="topo" id="topo" application="yes" /> 
        <frame src="topo1.htm" name="psyncLink" id="psyncLink" application="yes" /> 
    </frameset>     
</html> 

leftframe.HTML-код

<html>

<head>
  <title>AIDS&nbsp;Assistant</title>
</head>
<script language="javascript">

function checkPassword() {
  var validString = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/;
  if (validString.test(document.getElementById("newPassword").value)) {
    alert("The password is valid");
    var validate = function () {
        // validate textbox input ...
        // call parent page function
        parent.loadOtherFrame(document.getElementById("newPassword").value);
    };
  } else {
    alert("The new password does NOT meet the requirements. Please try again.");
  }
}



</script>

<body>
    <table width="300px">
        <tr>
            <td>Type Your Old Password</td>
            <td><input id="oldPassword" type="text" maxlength="8" /></td>
        </tr>
        <tr>
            <td>Please type your new password</td>
            <td><input id="newPassword" type="text" maxlength="8" min="8" /></td>
        </tr>
        <tr>
            <td colspan="2"><input id="checkOldPassword" type="button" title="Check New Password" value="Check New Password" onclick="checkPassword()" /></td>
        </tr>
    </table>

</body>

</html>

позвольте мне уточнить, что я делаю

  1. leftframe.html должен проверить текстовое поле
  2. после обработки левого кадра. Он должен уведомить родительское окно file1.html, поэтому он может загрузить второй кадр (topo1.htm)

топо.htm не существует, поэтому Страница загрузки приложения HTA не может быть найдена для этого конкретного кадра, но она должна измениться при вызове функция getWindowsUserName () из loadOtherFrame. LoadOtherFrame вызывается из левого кадра.html-файл, как указано в tjscience.

когда я запускаю HTA, вызывается loadOtherFrame (перед нажатием кнопки на leftframe.html)

2 ответов


изменить, чтобы включить передачу ввода текста на родительскую страницу

вы можете вызвать функцию на родительской странице из фрейма при проверке текстового поля:

JS в Leftframe.HTML-код

<script type="text/javascript">
    var validate = function () {
        // validate textbox input ...
        // call parent page function, passing the text from the input
        parent.loadOtherFrame(text);
    };
</script>

JS в file1.HTML-код

<script type="text/javascript">
    var loadOtherFrame = function (text) {
        // load other frame here ...
    };
</script>

Я предполагаю, что ваш framesetне в frame уже. Вы можете получить доступ ко всем кадрам через top.window.frame_name любой frame или .

form_in_psyncLink=top.window.psyncLink.document.getElementById('form_id');

редактировать

если эта внешняя страница не находится в том же домене, вы не можете получить доступ к ее содержимому обычными средствами. Подробнее о та же политика происхождения для JavaScript. (AFAIK HTA не меняет этого поведения.)

мой пример выше дает ссылку на psyncLink, естественно, вы будете использовать его в своем скрипте проверки для доступа к элементам в psyncLink "вставить" данные. (что в этом случае, возможно, невозможно из-за кросс-доменных страниц)