Próbuję wypełnić pola na formularzu przez JavaScript. Problem polega na tym, jak wiem, jak wykonać JavaScript na bieżącej stronie, więc nie mogę przekierować do formularza i wykonywać kodu. Nie waham się użyć tego terminu, ale jedynym wyrażeniem, który przychodzi na myśl, jest skrypt sieciowy. Kod, którego próbuję wykonać poniżej.

<script language="javascript"> 

window.location = "http://www.pagewithaform.com";

loaded();

//checks to see if page is loaded. if not, checks after timeout.
function loaded()
{
    if(window.onLoad)
    {
      //never executes on new page. the problem
      setTitle();
    }
    else
    {
      setTimeout("loaded()",1000);
      alert("new alert");
    }
}

//sets field's value
function setTitle()
{
    var title = prompt("Field Info","Default Value");
    var form = document.form[0];
    form.elements["fieldName"].value = title;
}
</script>

Nie jestem naprawdę pewien, czy to możliwe. Jestem również otwarty na inne pomysły, takie jak PHP. Dzięki.

Edytuj: Druga strona to formularz SharePoint. Nie mogę edytować żadnego z kodu w formularzu. Celem jest napisanie skryptu, który wstępnie wypełnia większość pól, ponieważ 90% z nich jest statyczna.

10
spassen 29 sierpień 2012, 21:42

3 odpowiedzi

Najlepsza odpowiedź

Próbujesz utrzymać stan między stronami. Konwencjonalnie istnieją dwa sposoby utrzymania stanu:

  • Stan sklepu w plikach cookie
  • Stan sklepu w ciągu zapytania

Tak czy inaczej Twoja pierwsza strona musi utrzymywać stan (do plików cookie lub ciągu zapytania), a druga strona musi - oddzielnie - przywrócić stan. Nie możesz używać tego samego skryptu na obu stronach.

Przykład: za pomocą plików cookie

Korzystając z plików cookie, pierwsza strona musiałaby napisać wszystkie dane formularzy, których potrzebujesz na następnej stronie do plików cookie:

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With Cookies</title>
 </head>
 <body>
     <div>
         Setting cookies and redirecting...
     </div>
     <script>
         // document.cookie is not a real string
         document.cookie = 'form/title=My Name is Richard; expires=Tue, 29 Aug 2017 12:00:01 UTC'
         document.cookie = 'form/text=I am demoing how to use cookies in JavaScript; expires=Tue, 29 Aug 2017 12:00:01 UT';
         setTimeout(function(){
             window.location = "./form-cookies.html";
         }, 1000);
     </script>
 </body>
</html>

... a druga strona przeczytałaby te pliki cookie i wypełnić z nimi pola formularza:

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With Cookies</title>
 </head>
 <body>
     <form id="myForm" action="submit.mumps.cgi" method="POST">
         <input type="text" name="title" />
         <textarea name="text"></textarea>
     </form>
     <script>
         var COOKIES = {};
         var cookieStr = document.cookie;
         cookieStr.split(/; /).forEach(function(keyValuePair) { // not necessarily the best way to parse cookies
             var cookieName = keyValuePair.replace(/=.*$/, ""); // some decoding is probably necessary
             var cookieValue = keyValuePair.replace(/^[^=]*\=/, ""); // some decoding is probably necessary
             COOKIES[cookieName] = cookieValue;
         });
         document.getElementById("myForm").getElementsByTagName("input")[0].value = COOKIES["form/title"];
         document.getElementById("myForm").getElementsByTagName("textarea")[0].value = COOKIES["form/text"];
     </script>
 </body>
</html>

Przykład: Używanie ciągu zapytania

W przypadku korzystania z ciągu zapytań, pierwsza strona włączaby ciąg adresowy w adresie URL przekierowania, jak więc:

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With The Query String</title>
 </head>
 <body>
     <div>
         Redirecting...
     </div>
     <script>
         setTimeout(function(){
             window.location = "./form-querystring.html?form/title=My Name is Richard&form/text=I am demoing how to use the query string in JavaScript";
         }, 1000);
     </script>
 </body>
</html>

... podczas gdy formularz przeanalizowałby ciąg zapytania (dostępny w JavaScript przez window.location.search - Premited z ?):

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With The Query String</title>
 </head>
 <body>
     <form id="myForm" action="submit.mumps.cgi" method="POST">
         <input type="text" name="title" />
         <textarea name="text"></textarea>
     </form>
     <script>
         var GET = {};
         var queryString = window.location.search.replace(/^\?/, '');
         queryString.split(/\&/).forEach(function(keyValuePair) {
             var paramName = keyValuePair.replace(/=.*$/, ""); // some decoding is probably necessary
             var paramValue = keyValuePair.replace(/^[^=]*\=/, ""); // some decoding is probably necessary
             GET[paramName] = paramValue;
         });
         document.getElementById("myForm").getElementsByTagName("input")[0].value = GET["form/title"];
         document.getElementById("myForm").getElementsByTagName("textarea")[0].value = GET["form/text"];
     </script>
 </body>
</html>

Przykład: z identyfikatorem fragmentu

Jest jeszcze jedna opcja: ponieważ stan jest utrzymywany ściśle na stronie klienta (nie na stronie serwera), możesz umieścić informacje w identyfikatorze fragmentu (część "Hash" częścią URL).

Pierwszy skrypt jest bardzo podobny do przykładu ciągu zapytania powyżej: URL przekierowania właśnie zawiera identyfikator fragmentu. Zamierzam ponownie użyć formatowania smyczkowania zapytania dla wygody, ale zauważ # w miejscu, w którym kiedyś był kiedyś:

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With The Fragment Identifier</title>
 </head>
 <body>
     <div>
         Redirecting...
     </div>
     <script>
         setTimeout(function(){
             window.location = "./form-fragmentidentifier.html#form/title=My Name is Richard&form/text=I am demoing how to use the fragment identifier in JavaScript";
         }, 1000);
     </script>
 </body>
</html>

... a następnie forma musi przenikać identyfikator fragmentu itp.:

<!DOCTYPE html>
<html>
 <head>
     <title>Maintaining State With The Fragment Identifier</title>
 </head>
 <body>
     <form id="myForm" action="submit.mumps.cgi" method="POST">
         <input type="text" name="title" />
         <textarea name="text"></textarea>
     </form>
     <script>
         var HASH = {};
         var hashString = window.location.hash.replace(/^#/, '');
         hashString.split(/\&/).forEach(function(keyValuePair) {
             var paramName = keyValuePair.replace(/=.*$/, ""); // some decoding is probably necessary
             var paramValue = keyValuePair.replace(/^[^=]*\=/, ""); // some decoding is probably necessary
             HASH[paramName] = paramValue;
         });
         document.getElementById("myForm").getElementsByTagName("input")[0].value = HASH["form/title"];
         document.getElementById("myForm").getElementsByTagName("textarea")[0].value = HASH["form/text"];
     </script>
 </body>
</html>

A jeśli nie możesz edytować kodu strony formy

Wypróbuj skrypt greasonkey.

17
Richard JP Le Guen 29 sierpień 2012, 18:50

Jest to dobre miejsce do użycia Ciasteczka

Ex: z Quirksmode.org

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

I notatka boczna, możesz użyć zdarzenia ONLOAD, aby wiedzieć, kiedy strona jest gotowa

<script language="javascript"> 

function setTitle(){
    var title = prompt("Field Info","Default Value");
    var form = document.form[0];
    form.elements["fieldName"].value = title;
}

windows.onload = setTitle;

</script>
1
Ibu 29 sierpień 2012, 17:48

Jeśli możliwe byłoby manipulowanie stronami docelowymi bez dostępu do systemu docelowego / źródła / metody MITM, to byłoby to naprawdę otwarta autostrada dla złośliwego oprogramowania w połączeniu z kliknięciem! Nie chcę, żeby twój skrypt opowiedział formularz mojego banku, co robić. ;-)

Używaj jakiegoś rodzaju narzędzi automatyzacji, takich jak autoit (www.autoitcript.com) w tym celu. Łatwy do nauczenia się i ma dobrą integrację formularzy. Jeśli standard nie wystarczy, szukaj UDF, takich jak WinHttp do autoit.

1
Zec 28 marzec 2018, 09:05