jQuery UI Datepicker nu funcționează

30 oct. 2011, 23:09:17
Vizualizări: 64.5K
Voturi: 4

Vreau să adaug un datepicker pe o pagină personalizată dar nu funcționează. Versiunea WP este 3.2.1. Acestea sunt șirurile de inițializare pe care le-am folosit în codul WP:

wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui-core'); 
wp_enqueue_script('jquery-ui-datepicker', get_bloginfo('template_url') . '/js/jquery-ui-datepicker.min.js', array('jquery','jquery-ui-core'));
wp_enqueue_style('jquery.ui.theme', get_bloginfo('template_url') . '/js/smoothness/jquery-ui-1.8.16.custom.css');

Aceste enqueue-uri generează următorul cod:

<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-includes/js/jquery/jquery.js?ver=1.6.1'></script>
<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-includes/js/jquery/ui.core.js?ver=1.8.12'></script>
<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/jquery-ui-datepicker.min.js?ver=3.2.1'></script>
<link rel='stylesheet' id='jquery.ui.theme-css'  href='http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/smoothness/jquery-ui-1.8.16.custom.css?ver=3.2.1' type='text/css' media='all' />

În corpul paginii, folosesc acest cod:

<script type="text/javascript">
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
</script>
<div class="row"><label for="day">Data</label><input type="text" id="datepicker" name="day" class="text" /></div>

Datepicker-ul nu funcționează. Nu știu cum să depanez această problemă. Nu face nimic, ca și cum jQuery nici nu ar exista.

ACTUALIZARE:

Cu ajutorul vostru am reușit să depanez codul. Am plasat scriptul după div și l-am modificat în:

<script type="text/javascript">
jQuery(document).ready(function() {
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
});
</script>

Acest cod îmi dă eroare când apelez metoda datepicker, eroarea spune:

Uncaught TypeError: Object [object Object] has no method 'datepicker'

Dacă scriu jQuery('#datepicker') în consola javascript, primesc:

[<input type=​"text" id=​"datepicker" name=​"day" class=​"text">​]

Nu primesc alte erori în afară de aceasta, toate referințele la jQuery par să funcționeze bine.

ACTUALIZARE 2:

În sfârșit am reușit să-l fac să funcționeze! A trebuit să folosesc 'wp_print_scripts' în loc de 'init', și a trebuit să repoziționez codul de inițializare al unui alt plugin care era în conflict. Singura problemă rămasă sunt temele... dacă folosesc tema de bază din googlecode, funcționează. Dacă folosesc alte teme (încorporate în wp sau conectate cu wp_enqueque_style) tema nu va fi încărcată... dacă verific html-ul generat, nu există nicio urmă a liniei care ar trebui să încarce tema jQuery.

6
Comentarii

Pare în regulă la nivel de WordPress (încărcări corecte, output, apel jQuery fără shorthand) și ca atare probabil nu este specific WordPress. Mai sunt detalii legate de WP? Altfel, cel mai bine e să întrebi pe StackOverflow.

Rarst Rarst
30 oct. 2011 23:22:10

Dacă "pagina personalizată" este o pagină de administrare, atunci trebuie să o încarci puțin diferit. Vezi: http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Tom Auger Tom Auger
31 oct. 2011 00:24:34

Ce alte detalii legate de WP ai nevoie? Întreabă și voi răspunde. Pagina nu este specifică Admin. Este doar o pagină WP, creată folosind un șablon de pagină personalizat care conține codul pe care îl folosesc.

Terix Terix
31 oct. 2011 09:16:57

De asemenea, doar pentru că funcția enqueue a introdus tag-urile necesare de SCRIPT sau STYLE în head-ul tău, nu înseamnă neapărat că acestea s-au încărcat efectiv (URL-urile ar putea fi greșite - mi s-a întâmplat de zeci de ori!). Din nou, folosește Firebug sau Google Chrome și verifică statisticile de rețea - dacă vezi erori roșii 404, înseamnă că fișierul de script sau CSS nu a fost găsit la adresa specificată.

Tom Auger Tom Auger
31 oct. 2011 14:58:37

scripturile și stilurile sunt toate găsite, singura eroare pe care o primesc este mult mai jos, la apelul efectiv al metodei datepicker()

Terix Terix
31 oct. 2011 22:57:15

pentru informație, init nu este locul potrivit pentru a face enqueue-uri, acestea ar trebui să fie plasate pe acțiunea wp_enqueue_scripts (este destinată pentru enqueue-uri). De asemenea, nu ai nevoie de primele două linii de enqueue pentru că le-ai setat ca dependințe pentru datepicker.

t31os t31os
1 nov. 2011 00:31:52
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 4
5

Deseori tastez greșit. Așa că, aș începe depanarea copiind și lipind linkurile către scripturile JS în browserul tău pentru a mă asigura că se încarcă.

Apoi, în Chrome, mergi la Meniul Cheie -> Instrumente -> Consolă JavaScript. Aici vei putea tasta/executa JavaScript direct. Aș începe prin a tasta jQuery în consolă pentru a mă asigura că jQuery este încărcat. Apoi încearcă să folosești jQuery('#datepicker') - dacă returnează paranteze goale [], atunci selectorul tău eșuează. Dacă funcționează, încearcă să deschizi datepicker-ul - probabil vei vedea o eroare în consola JS.

Cum au sugerat și alții, cred că problema este că scriptul rulează înainte ca elementul să fie randat. Aș sugera să faci următoarele:

<script type="text/javascript">
jQuery(document).ready(function() {
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
});
</script>

Asta va forța scriptul să ruleze după ce întreaga pagină s-a încărcat.

== EXEMPLU ==

add_action( 'init', 'wp29r01_date_picker' );
function wp29r01_date_picker() {
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'jquery-ui-core' );
    wp_enqueue_script( 'jquery-datepicker', 'http://jquery-ui.googlecode.com/svn/trunk/ui/jquery.ui.datepicker.js', array('jquery', 'jquery-ui-core' ) );
}

add_action( 'wp_footer', 'wp29r01_print_scripts');
function wp29r01_print_scripts() {
    ?>
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('#datepicker').datepicker();
    })
</script>
    <?php
}
31 oct. 2011 17:11:38
Comentarii

Am urmat sfaturile tale și am făcut câțiva pași: acum am eroarea care îmi oprește codul să funcționeze. Spune: Uncaught TypeError: Object [object Object] has no method 'datepicker' pe linia jQuery('#datepicker').datepicker

Terix Terix
31 oct. 2011 22:33:05

Dacă acesta este cazul, atunci scriptul datepicker nu este inclus corect sau este scriptul greșit. Voi actualiza postarea mea cu cod care funcționează.

v0idless v0idless
31 oct. 2011 23:14:13

Asta mă înnebunește... încă am aceeași eroare! Am schimbat codul conform sugestiei tale, când scriu jQuery('#datepicker') primesc div-ul ca înainte, dar tot primesc aceeași eroare exactă! Am testat cu un fișier html gol, punând html-ul generat de wp_enqueues, și cu această pagină de test funcționează, deci este ceva în interiorul WP care strică datepicker(), dar nu am nicio idee cum să rezolv asta...

Terix Terix
1 nov. 2011 09:34:20

Apoi, ceea ce aș face este să setez tema la twentyeleven și să dezactivez toate celelalte plugin-uri. Activează-le pe rând până când găsești care dintre ele cauzează problema cu datepicker.

v0idless v0idless
1 nov. 2011 14:32:08

În sfârșit am reușit să o fac să funcționeze! A trebuit să folosesc 'wp_print_scripts' în loc de 'init' și să repoziționez niște cod de inițializare al unui alt plugin care intra în conflict. Singura problemă rămasă sunt temele... dacă folosesc tema de bază din googlecode, funcționează. Dacă folosesc alte teme (încorporate sau legate cu wp_enqueque_style), tema nu va fi încărcată.

Terix Terix
2 nov. 2011 09:20:47
0

Pentru cei care depanează un datepicker care "nu funcționează" - în cazul meu problema a fost din cauza CSS-ului de reset, mai exact a acestei reguli:

html, body { overflow: auto; }

Datepicker-ul meu funcționa corect, dar apărea în partea de sus a ecranului. :)

27 apr. 2013 21:47:52
2

În exemplul tău, jQuery este plasat înainte ca div-ul 'datepicker' să fie creat. Deci nu va face nimic. Fie plasează blocul script după div-ul 'row', fie folosește jQuery(document).ready() în schimb.

31 oct. 2011 00:27:17
Comentarii

Am plasat scriptul după '<div>' dar nu s-a schimbat nimic. Am creat o pagină de test, HTML simplu, doar cu codul HTML generat din pagina wp, dar încă nu funcționează. Cum pot depana problema?

Terix Terix
31 oct. 2011 09:22:08

Asigură-te că ai Firebug, Google Chrome sau folosește Explorer cu Developer Tools activat (F12). Verifică consola de erori pentru a identifica eventualele erori JavaScript. Poți posta un link și vom arunca o privire.

Tom Auger Tom Auger
31 oct. 2011 14:56:32
2

Includează și scriptul tău personalizat prin wp_enqueue_script() și referențiază celelalte biblioteci, astfel nu vei avea probleme cu cronologia; scriptul tău personalizat va cere încărcarea bibliotecilor datepicker după ce toate celelalte scripturi sunt gata; funcționează corect și în versiunile viitoare ale WordPress.

31 oct. 2011 03:08:16
Comentarii

te referi să pui codul jquery într-un fișier js și să-l apelezi?

Terix Terix
31 oct. 2011 09:23:20

@bueltge asta ar rezolva problema doar dacă Terix l-ar apela astfel: wp_enqueue_script( 'do-date', 'http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/do_date.js' , array('jquery-ui-datepicker'), 1, true ) - ultimul 'true' fiind important pentru a pune scriptul în footer, adică după ce div-ul a fost creat. Tot prefer să folosesc document.ready(), indiferent.

Tom Auger Tom Auger
31 oct. 2011 15:01:53