Jak określa się domyślny przycisk wysyłania w formularzu HTML?


210

Jeśli formularz zostanie przesłany, ale nie przez żaden konkretny przycisk, taki jak

  • naciskając Enter
  • za pomocą HTMLFormElement.submit()w JS

w jaki sposób przeglądarka ma określić, który z wielu przycisków przesyłania, jeśli w ogóle, ma być użyty jako naciśnięty?

Jest to istotne na dwóch poziomach:

  • wywołanie onclickprocedury obsługi zdarzenia dołączonej do przycisku wysyłania
  • dane wysłane z powrotem do serwera WWW

Moje dotychczasowe eksperymenty wykazały, że:

  • po naciśnięciu EnterFirefox, Opera i Safari używają pierwszego przycisku przesyłania w formularzu
  • po naciśnięciu EnterIE używa albo pierwszego przycisku przesyłania, albo żadnego, w zależności od warunków, których nie byłem w stanie zrozumieć
  • wszystkie te przeglądarki w ogóle nie używają żadnego do przesłania JS

Co mówi standard?

Jeśli to pomoże, oto mój kod testowy (PHP dotyczy tylko mojej metody testowania, a nie samego pytania)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>

<body>

<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>

<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>

<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
    <input type="text" name="method" />
    <input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
    <input type="text" name="stuff" />
    <input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
    <input type="button" value="submit" onclick="document.theForm.submit();" />
</form>

</body></html>

Odpowiedzi:


115

Jeśli prześlesz formularz przez Javascript (tj. formElement.submit()Lub cokolwiek równoważnego), żaden z przycisków przesyłania nie zostanie uznany za udany i żadna z ich wartości nie zostanie uwzględniona w przesłanych danych. (Pamiętaj, że jeśli prześlesz formularz za pomocą, submitElement.click()wówczas przesłanie, do którego miałeś odniesienie, jest uważane za aktywne; to tak naprawdę nie wchodzi w zakres pytania, ponieważ tutaj przycisk przesyłania jest jednoznaczny, ale pomyślałem, że go dołączę dla osób, które czytają pierwszą część i zastanawiają się, jak sprawić, by przycisk wysyłania powiódł się poprzez przesłanie formularza JS. Oczywiście, osoby obsługujące onsubmit formularza nadal będą strzelać w ten sposób, podczas gdy nie zrobią tego, form.submit()więc to kolejny czajnik ryb ...)

Jeśli formularz zostanie przesłany przez naciśnięcie klawisza Enter w polu innym niż tekstowy, wówczas agent użytkownika decyduje o tym, czego chce tutaj. Te specyfikacje nie mówią nic o przesłanie formularza za pomocą Enter podczas gdy w polu tekstowym (jeśli zakładka do przycisku i aktywować go za pomocą spacji lub cokolwiek, to nie ma problemu, ponieważ tego konkretnego przycisk Prześlij jest jednoznacznie używany). Mówi się tylko, że formularz musi zostać przesłany po aktywowaniu przycisku wysyłania, nie jest nawet wymogiem, że naciśnięcie klawisza Enter np. Wprowadzenie tekstu spowoduje przesłanie formularza.

Uważam, że Internet Explorer wybiera przycisk przesyłania, który pojawia się jako pierwszy w źródle; Mam wrażenie, że Firefox i Opera wybierają przycisk z najniższym tabindex, wracając do pierwszego zdefiniowanego, jeśli nic innego nie jest zdefiniowane. Istnieją również pewne komplikacje dotyczące tego, czy przesłane dane mają atrybut wartości innej niż domyślna IIRC.

Chodzi o to, że nie ma zdefiniowanego standardu tego, co się tutaj dzieje, i jest to całkowicie zależne od przeglądarki - tak dalece, jak to możliwe, we wszystkim, co robisz, staraj się unikać polegania na jakimś konkretnym zachowaniu. Jeśli naprawdę musisz wiedzieć, prawdopodobnie możesz dowiedzieć się, jak działają różne wersje przeglądarki, ale kiedy to zbadałem jakiś czas temu, pojawiły się dość skomplikowane warunki (które oczywiście mogą ulec zmianie w przypadku nowych wersji przeglądarki) i radziłbym aby tego uniknąć, jeśli to możliwe!


1
Odnośnie do paragrafu 2: Moje podstawowe pytanie brzmiało, czy jest coś w jakiejkolwiek specyfikacji skutkującej „Jeśli przeglądarka zapewnia sposób na przesłanie formularza bez określenia kontroli przesyłania ...”. Ale z odpowiedzi Dawida wynika, że ​​nie ma. Chodzi mi o IE, że czasami naciśnięcie Enter przesyła formularz i nie ustawia żadnego przycisku wysyłania. Konsekwencją jest to, że jeśli masz wiele formularzy przesyłanych do tego samego skryptu, nie możesz polegać na przyciskach przesyłania, aby je rozróżnić. To pojawiło się w projekcie, nad którym pracuję.
Stewart

1
Bardzo przydatna sekcja nawiasów akapitu pierwszego - dzięki.
rbassett

63

HTML 4 nie wyraża tego wprost. Bieżąca robocza wersja robocza HTML5 określa, że ​​pierwszy przycisk przesyłania musi być domyślny :

A formdomyślny przycisk elementu jest pierwszy złożyć przycisk w kolejności drzewa , którego właściciel forma jest formelementem.

Jeśli aplikacja kliencka obsługuje niejawne przesyłanie formularza przez użytkownika (na przykład na niektórych platformach naciśnięcie klawisza „enter”, gdy pole tekstowe jest aktywne, niejawnie przesyła formularz), to w przypadku formularza, którego domyślny przycisk ma zdefiniowaną aktywację zachowanie musi spowodować, że agent użytkownika uruchomi kroki aktywacji kliknięcia syntetycznego na tym domyślnym przycisku .


Ok, więc to właśnie powinno zrobić. Mogę uzyć?
Pacerier

Cieszę się, że widzę „dorozumiane przesłanie” w HTML5.
Clint Pachl

61

Andrezj prawie go przybił ... ale oto proste rozwiązanie dla różnych przeglądarek.

Weź taką formę:

<form>
    <input/>
    <button type="submit" value="some non-default action"/>
    <button type="submit" value="another non-default action"/>
    <button type="submit" value="yet another non-default action"/>

    <button type="submit" value="default action"/>
</form>

i zwróć uwagę na to:

<form>
    <input/>

    <button style="overflow: visible !important; height: 0 !important; width: 0 !important; margin: 0 !important; border: 0 !important; padding: 0 !important; display: block !important;" type="submit" value="default action"/>

    <button type="submit" value="some non-default action"/>
    <button type="submit" value="another non-default action"/>
    <button type="submit" value="yet another non-default action"/>
    <button type="submit" value="still another non-default action"/>

    <button type="submit" value="default action"/>
</form>

Ponieważ specyfikacja W3C wskazuje, że wiele przycisków przesyłania jest poprawnych, ale pomija wskazówki dotyczące tego, jak klient użytkownika powinien je obsługiwać, producenci przeglądarek mogą wdrożyć, jak uznają za stosowne. Odkryłem, że albo prześlą pierwszy przycisk przesyłania w formularzu, albo prześlą następny przycisk przesyłania po polu formularza, które jest aktualnie aktywne.

Niestety, po prostu dodaje styl wyświetlania: brak; nie będzie działać, ponieważ specyfikacja W3C wskazuje, że jakikolwiek ukryty element powinien być wykluczony z interakcji użytkownika. Zamiast tego ukryj to na widoku!

Powyżej znajduje się przykład rozwiązania, które ostatecznie wprowadziłem do produkcji. Naciśnięcie klawisza Enter powoduje, że domyślne przesłanie formularza jest zgodne z oczekiwaniami, nawet jeśli istnieją inne wartości inne niż domyślne i poprzedzają domyślny przycisk przesyłania w DOM. Premia za interakcję myszy / klawiatury z wyraźnymi danymi wejściowymi użytkownika, przy jednoczesnym unikaniu procedur obsługi javascript.

Uwaga: tabulacja w formularzu nie wyświetli fokusa dla żadnego elementu wizualnego, ale nadal spowoduje wybranie niewidocznego przycisku. Aby uniknąć tego problemu, wystarczy odpowiednio ustawić atrybuty tabindex i pominąć atrybut tabindex na niewidzialnym przycisku przesyłania. Choć może wydawać się nie na miejscu, aby promować te style! Ważne, że należy zapobiec ramowych lub istniejących stylów przycisków zakłócaniu tej poprawki. Te wbudowane style są zdecydowanie kiepską formą, ale sprawdzamy tutaj koncepcje ... nie pisząc kodu produkcyjnego.


5
Dzięki. Natknąłem się na wyświetlacz: żaden problem również. Zamiast minimalizować przycisk, możesz również przenieść go ze strony, zastępując go przyciskiem <div style="position: fixed; left: -1000px; top: -1000px />. Jeszcze jedna sprawa do zmartwienia: minimalizacja lub odsunięcie przycisku od przepływu strony za pomocą CSS może powodować problemy z WAI, ponieważ czytniki ekranu nadal będą widzieć przycisk domyślny.
Stefan Haberl

2
DZIĘKUJEMY @James za tę szczegółową odpowiedź.
Nathan

1
to zadziałało dla mnie, dzięki. Musiałem dodać to do granicy przycisku: brak; aby całkowicie zniknął
Macumbaomuerte

4
Możesz po prostu ustawić atrybut tabindex ukrytego przycisku na -1
tvanc

2
Po co <input/>tam jest?
Sz.

16

Myślę, że ten post pomógłby, gdyby ktoś chciał to zrobić za pomocą jQuery:

http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/

Podstawowym rozwiązaniem jest:

$(function() {
    $("form input").keypress(function (e) {
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
        $('input[type=submit].default').click();
        return false;
    } else {
        return true;
    }
    });
});

a innym podobało mi się:

jQuery(document).ready(function() {
$("form input, form select").live('keypress', function (e) {
if ($(this).parents('form').find('button[type=submit].default, input[type=submit].default').length <= 0)
return true;

if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
$(this).parents('form').find('button[type=submit].default, input[type=submit].default').click();
return false;
} else {
return true;
}
});
}); 

jQuery.Event zawsze ma swój .wichatrybut. Również nie trzeba wracać do DOM .keyCode(lub .charCodew tym przypadku).
Arjan,

Kolejnym problemem dotyczącym jQuery tutaj jest niepotrzebne podwójne zapytanie. Ponieważ nie ma potrzeby zwracania wartości true, dodatkowo wersja jQuery staje się bardzo jasna i krótka na temat integracji redukcji zalecanych wcześniej przez Arjana.
soletan

Użyłem keydown zamiast keypress (unikaj czekania na keyup) i dodałem e.preventDefault();na początku tej funkcji, aby uniknąć wykonania „prawdziwego” domyślnego przycisku. Działa naprawdę dobrze.
Matt Roy

6

Miałem formularz z 11 przyciskami przesyłania i zawsze używałby pierwszego przycisku przesyłania, gdy użytkownik nacisnął klawisz Enter. Czytałem gdzie indziej, że nie jest dobrym pomysłem (zła praktyka), aby mieć więcej niż jeden przycisk wysyłania w formularzu, a najlepszym sposobem na to jest posiadanie przycisku, który chcesz domyślnie, jako jedynego przycisku wysyłania w formularzu. Pozostałe przyciski powinny zostać zmienione na „TYPE = BUTTON” i dodane zdarzenie onClick, które wywołuje własną procedurę przesyłania w Javascript. Coś takiego :-

<SCRIPT Language="JavaScript">
function validform()
{
  // do whatever you need to validate the form, and return true or false accordingly
}

function mjsubmit()
{
  if (validform()) { document.form1.submit(); return true;}
  return false;
}
</SCRIPT>
<INPUT TYPE=BUTTON NAME="button1" VALUE="button1" onClick="document.form1.submitvalue='button1'; return mjsubmit();">
<INPUT TYPE=BUTTON NAME="button2" VALUE="button2" onClick="document.form1.submitvalue='button2'; return mjsubmit();">
<INPUT TYPE=SUBMIT NAME="button3" VALUE="button3" onClick="document.form1.submitvalue='button3'; return validform();">
<INPUT TYPE=BUTTON NAME="button4" VALUE="button4" onClick="document.form1.submitvalue='button4'; return mjsubmit();">

Tutaj przycisk 3 jest domyślny i chociaż programowo przesyłasz formularz innymi przyciskami, procedura mjsubmit je sprawdza. HTH.


19
Kiepski pomysł. Twój formularz nie będzie działał z wyłączonym JS. JS powinien być stosowany dyskretnie.
BalusC,

7
Bardzo niewiele przeglądarek ma domyślnie wyłączone JS, nawet te na iPodzie! W formularzu, który cytowałem, JS off uczyniłoby go bezużytecznym! Tyle zależy od uruchomionego JS.
grafika

7
Wyłączone domyślnie czy nie, ci, którzy mają wyłączoną JS, nie powinni jej włączać tylko po to, aby obejść tak głupią, małą przeszkodę jak ta.
Stewart

2
jaki rodzaj formularza ma 11 przycisków przesyłania? ( ciekawość )
Ben

2
Największym powodem, dla którego widzę sprawdzanie poprawności dyskretnego Javascript, jest to, że narzucający się JavaScript jest zwykle niezręczny. Nie jestem pewien, jak zakwalifikować to, co myślę, ale kiedy widzę strony całkowicie zależne od JS, zakładam się, że mogę zrobić pewne trudne rzeczy z moim DOM i zrobić coś niezamierzonego na serwerze.
Samantha Branham

6

Można to teraz rozwiązać za pomocą flexbox:

HTML

<form>
    <h1>My Form</h1>
    <label for="text">Input:</label>
    <input type="text" name="text" id="text"/>

    <!-- Put the elements in reverse order -->
    <div class="form-actions">
        <button>Ok</button> <!-- our default action is first -->
        <button>Cancel</button>
    </div>
</form>

CSS

.form-actions {
    display: flex;
    flex-direction: row-reverse; /* reverse the elements inside */
}

Wyjaśnieniu
Korzystanie z elastycznego okno, możemy odwrócić kolejność elementów w pojemniku, który używa display: flexzarówno stosując regułę CSS flex-direction: row-reverse. Nie wymaga to CSS ani ukrytych elementów. W przypadku starszych przeglądarek, które nie obsługują Flexboksa, nadal mają praktyczne rozwiązanie, ale elementy nie zostaną odwrócone.

Demo
http://codepen.io/Godwin/pen/rLVKjm


2

Zmagałem się z tym samym pytaniem, ponieważ miałem przycisk „Prześlij” na środku, z którego przekierowałem przesłanie na inną stronę, na przykład:

<button type="submit" onclick="this.form.action = '#another_page'">More</button>

Gdy użytkownik nacisnął klawisz Enter, ten przycisk został kliknięty zamiast innego przycisku przesyłania.

Zrobiłem więc prymitywne testy, tworząc z wieloma przyciskami przesyłania i różnymi opcjami widoczności oraz powiadamiając o zdarzeniu onclick, który przycisk został kliknięty: https://jsfiddle.net/aqfy51om/1/

Przeglądarki i systemy operacyjne, których użyłem do testowania:

OKNA

  • Google Chrome 43 (dalej Google: D)
  • Mozilla Firefox 38
  • Internet Explorer 11
  • Opera 30.0

OSX

  • Google Chrome 43
  • Safari 7.1.6

Większość tych przeglądarek kliknęła pierwszy przycisk pomimo zastosowanych opcji widoczności oprócz IE i Safari, które kliknęły trzeci przycisk, który jest „widoczny” w „ukrytym” pojemniku:

<div style="width: 0; height: 0; overflow: hidden;">
    <button type="submit" class="btn btn-default" onclick="alert('Hidden submit button #3 was clicked');">Hidden submit button #3</button>
</div>

Tak więc moją propozycją, której zamierzam użyć, jest:

Jeśli formularz ma wiele przycisków przesyłania o różnym znaczeniu, na początku formularza dołącz przycisk przesyłania z domyślną akcją, który jest albo:

  1. W pełni widoczne
  2. Zapakowane w pojemnik z style="width: 0; height: 0; overflow: hidden;"

EDYCJA Inną opcją może być przesunięcie przycisku (wciąż na początku od) style="position: absolute; left: -9999px; top: -9999px;", po prostu wypróbowałem go w IE - działało, ale nie mam pojęcia, co jeszcze może zepsuć, na przykład drukowanie.


1

Z twoich komentarzy:

Konsekwencją jest to, że jeśli masz wiele formularzy przesyłanych do tego samego skryptu, nie możesz polegać na przyciskach przesyłania, aby je rozróżnić.

Wrzucam <input type="hidden" value="form_name" />do każdej formy.

W przypadku przesyłania za pomocą javascript: dodaj zdarzenia wysyłania do formularzy, a nie klikaj zdarzeń w ich przyciskach. Użytkownicy Saavy nie dotykają często myszy.


Rzeczywiście, ale to nasuwa pytanie: stackoverflow.com/questions/541869/…
Stewart

1

Jeśli masz wiele przycisków przesyłania w jednym formularzu, a użytkownik naciśnie klawisz ENTER, aby przesłać formularz z pola tekstowego, kod ten zastępuje domyślną funkcjonalność, wywołując zdarzenie Prześlij w formularzu ze zdarzenia naciśnięcia klawisza. Oto ten kod:

$('form input').keypress(function(e){

    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)){ $(e.target).closest('form').submit(); return false; }
    else return true;

});

Prosty i rozwiązuje problem
toddmo

1

Dziwne, że pierwszy przycisk Enter przechodzi zawsze do pierwszego przycisku, niezależnie od tego, czy jest widoczny, czy nie, np. Przy użyciu jquery show/hide(). Dodanie atrybutu .attr('disabled', 'disabled')uniemożliwia otrzymanie przycisku Enter całkowicie. Jest to problem na przykład podczas dostosowywania widoczności przycisku Wstaw / Edytuj + Usuń w oknach dialogowych zapisu. Znalazłem mniej hackerskie i proste umieszczanie Edytuj przed Insert

<button type="submit" name="action" value="update">Update</button>
<button type="submit" name="action" value="insert">Insert</button>
<button type="submit" name="action" value="delete">Delete</button>

i użyj kodu javascript:

$("#formId button[type='submit'][name='action'][value!='insert']").hide().attr('disabled', 'disabled');
$("#formId button[type='submit'][name='action'][value='insert']").show().removeAttr('disabled');

0

mój przepis:

<form>
<input type=hidden name=action value=login><!-- the magic! -->

<input type=text name=email>
<input type=text name=password>

<input type=submit name=action value=login>
<input type=submit name=action value="forgot password">
</form>

Wyśle domyślne ukryte pole, jeśli żaden z przycisków nie zostanie „kliknięty”.

jeśli zostaną kliknięte, mają preferencje i ich wartość jest przekazywana.


2
Ale czy to zachowanie jest określone przez standard? I czy można ufać przeglądarkom, że poprawnie go wdrożą?
Stewart

dobre pytanie. przetestowałem go pod kątem działania na wszystkich przeglądarkach A (z matrycy Yui) i jest to najbardziej konsekwentne, jakie mogłem uzyskać w prawdziwym życiu (bez względu na to, co określają standardy)
gcb

@yellowandred co się dzieje? przyjrzy się później
gcb

1
mój błąd, zmieniłem {type = "hidden"} i nie zauważyłem tych samych wartości „name”.
Żółty i czerwony

To nie działa dla mnie w IE11 lub Fx30. Wartość jest zawsze ustawiona na wartość ukrytą.
Jamie Kitson

0

Innym rozwiązaniem, którego użyłem, jest tylko jeden przycisk w formularzu i fałszywe pozostałe przyciski.

Oto przykład:

<form>
  <label for="amount">Amount of items</label>
  <input id="amount" type="text" name="amount" />
  <span id="checkStock" class="buttonish">Check stock</span>
  <button type="submit" name="action" value="order">Place order</button>
</form>

Następnie projektuję elementy rozpiętości, aby wyglądały jak przycisk. Odbiornik JS obserwuje zakres i po kliknięciu wykonuje żądaną operację.

Niekoniecznie odpowiednie dla wszystkich sytuacji, ale przynajmniej dość łatwo to zrobić.


1
Jaka jest awaria dla użytkowników, którzy wyłączyli JS?
Stewart

Użytkownicy z wyłączoną JS nie będą mogli korzystać z Internetu, w dzisiejszych czasach jest to tak proste.
Christoffer Bubach

0

Ze specyfikacji HTML 4 :

Jeśli formularz zawiera więcej niż jeden przycisk wysyłania, tylko aktywowany przycisk wysyłania zakończy się powodzeniem.

Oznacza to, że biorąc pod uwagę więcej niż 1 przycisk przesyłania i żaden aktywowany (kliknięty), żaden nie powinien zakończyć się powodzeniem.

I twierdzę, że ma to sens: wyobraź sobie ogromną formę z wieloma przyciskami wysyłania. U góry znajduje się przycisk „usuń ten rekord”, następnie pojawia się wiele danych wejściowych, a na dole znajduje się przycisk „usuń ten rekord”. Użytkownik uderzający w klawisz Enter, gdy znajduje się w polu u dołu formularza, nigdy nie podejrzewałby, że w sposób dorozumiany uderza „usuń ten rekord” z góry.

Dlatego uważam, że nie jest dobrym pomysłem używanie pierwszego lub innego przycisku, którego użytkownik nie zdefiniuje (nie kliknie). Niemniej jednak przeglądarki to robią.


-2

EDYCJA: Przepraszam, pisząc tę ​​odpowiedź, myślałem o przesłaniu przycisków w ogólnym znaczeniu. Odpowiedź poniżej nie dotyczy wielu type="submit"przycisków, ponieważ pozostawia tylko jeden type="submit"i zmienia drugi na type="button". Zostawiam tutaj odpowiedź jako odniesienie na wypadek, gdyby ktoś mógł zmienić typeformę:

Aby określić, który przycisk zostanie naciśnięty po naciśnięciu klawisza Enter, możesz oznaczyć go type="submit", a pozostałe przyciski - type="button". Na przykład:

<input type="button" value="Cancel" />
<input type="submit" value="Submit" />

Wpisz „przycisk” nie powoduje przesłania formularza. Służy tylko do uruchamiania skryptów po stronie klienta.
Stewart

właśnie dlatego przeglądarka pomija go po naciśnięciu Enter, a ta z typem „Prześlij” zostaje wykonana. Możesz użyć tego z typem „przycisk”, aby na przykład zrobić cokolwiek innego po kliknięciu. Usuń głos negatywny.
Jesús Carrera

Pytanie dotyczyło wielu przycisków przesyłania .
Stewart

Mój przykład jest całkowicie poprawny dla wielu przycisków przesyłania. Ten z typem „prześlij” to taki, który określony przez przeglądarkę działa jako wciśnięty (o to chodziło w pytaniu). Następnie za pomocą drugiego przycisku możesz użyć go jako przycisku przesłania, używając zdarzeń JavaScript, takich jak zdarzenie onClick, które masz w swoim przykładzie. Więc moja odpowiedź jest istotna i nie zasługuję na głosowanie w dół. Proszę to usunąć.
Jesús Carrera,

1
Jeśli chciałeś zasugerować usunięcie niejasności, czyniąc tylko jeden z nich, wpisz „prześlij” i używając JavaScript do implementacji innych przycisków, to jest to duplikat odpowiedzi graficznej i jako taki został już odrzucony jako zły pomysł.
Stewart,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.