Come creare un collegamento di solo ancoraggio VUOTO con l ()?


20

Sto cercando di usare l()per ottenere qualcosa del genere <a href='#' ...>, per scopi di chiamata Ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l è molto vicino alla cosa giusta - usa un'opzione in l()like 'fragment' => 'foo'per produrre un link simile <a href='#foo'...>- ma io sono cercando di ottenere un '#' pulito. C'è un modo per farlo, o dovrei semplicemente inserire qualcosa come parte del frammento e non preoccuparmene?

Risposte:


12

Se non potessi usare "#" pulito con frammento, ti suggerirei di usare <a href="javascript:">link</a>.
Quando si aggiunge "javascript:" o "javascript: void (0)" hrefall'attributo, il <a>tag non farà nulla. Quindi puoi associare "onclick" al link per il tuo scopo Ajax.
Puoi implementarlo usando la l()funzione come di seguito:

     l('link', 'javascript:',  array('external' => TRUE));

che direjavascript:void(0)
Serjas,

1
@Serjas, javascript:e javascript:void(0)sono gli stessi. L'unica differenza è "void (0)" :)
Sithu,

Voglio dire, l () convert ()?
Serjas,

6
Non dovresti mai usare tali shenanigans e usare solo JavaScript guidato dagli eventi! Questo è il 2012, non il 2004. Perché viene votata una risposta di così bassa qualità? Popolare perché è facile? Ma è estremamente sbagliato. :(

@chx, poiché sei un manutentore di core drupal, spero che tu non stia abusando di non usare il secondo parametro per la funzione l () piuttosto che il percorso o il frammento. Sfortunatamente, la funzione accetta "javascript" come percorso :) Se è estremamente sbagliato, perché Drupal lo accetta. Probabilmente, sarà limitato nelle versioni successive di Drupal.
Sithu,

15

Tempo di quiz pop tipizzazione PHP! (Informativa completa: non ho vinto nel nostro ufficio).

Come già sottolineato, questo è il codice di l()cui ci occupiamo:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

Quindi, ecco la domanda: quale valore viene lanciato su una stringa vuota ma passa quanto segue?

(isset($var) && $var !== '')

La risposta è FALSE:!

Quindi, potremmo provare questo:

l(t('My link'), NULL, array('fragment' => FALSE));

Che ci dà:

<a href="/#">My link</a>

Per fortuna possiamo eliminare quella barra iniziale passando external => TRUE:

l(t('My link'), NULL, array('external' => TRUE, 'fragment' => FALSE));

Che ci dà:

<a href="#">My link</a>

Boom. Le cose che facciamo per evitare di concatenare manualmente le stringhe HTML, eh?

poscritto:

Non sono sicuro che consiglierei di stampare un link come questo da PHP in circostanze normali. Senza il tuo javascript, tutto quel link lo farà saltare l'utente in cima alla pagina ( che, con mia leggera sorpresa, è un comportamento speculato ). Probabilmente dovrebbe puntare da qualche parte che funziona senza javascript.

Se il collegamento ha davvero senso solo con javascript in giro (come i controlli per una presentazione solo js o qualcosa del genere), penso che sia meglio aggiungere il collegamento alla pagina con javascript. In alternativa, se vuoi davvero inserirlo nella tua fonte, assicurati che sia display:nonepredefinito. Drupal ha la .jsclasse sull'html per poi mostrarlo quando JavaScript è in giro.


7

Sfortunatamente la url()funzione (che l()chiama internamente) praticamente annulla ogni possibilità di un frammento vuoto con le seguenti righe:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

Verifica che il frammento non sia una stringa vuota, che è ciò che dovresti passare per ottenere la pulizia #. Penso che la soluzione più semplice sarebbe quella di scegliere l'id di un elemento adatto da qualche parte nella pagina e usarlo invece per il frammento (o javascript:voidcome ha detto Sithu).

Tuttavia ... il modo più accessibile (e successivamente, in molti paesi, il modo legale; si pensi alla sezione 508 negli Stati Uniti, alla DDA nel Regno Unito, ecc.) Sarebbe quello di fornire il contenuto che viene caricato / regolato dal tuo link su una pagina separata e utilizzare invece l'URL per quella pagina come href del collegamento. Dovresti quindi utilizzare JavaScript per impedire all'evento sul link di reindirizzare effettivamente la pagina per quei browser che lo hanno abilitato.

In questo modo hai contenuti di fallback per gli utenti senza javascript, rimani legale e rendi felici tutti e il loro cane :)


Ottima modifica al fallback! Se utilizziamo l'URL ajax nell'href del link, la pagina chiamante può essere un HTML renderizzabile se javascript è disabilitato? Ho mai avuto print drupal_json_output($output)nella mia pagina di chiamate Ajax.
Sithu,

4

Non puoi usare clean #.

Ma è possibile aggiungere space symboldopo #:

  l('Link title', '# ', array('external' => TRUE));

2

Ho appena avuto lo stesso problema, ma nessuna delle soluzioni è stata soddisfacente, quindi ho trovato la mia:

l('link', '', array('fragment' => ' ', 'html' => TRUE, 'external' => TRUE));

Questo produce un pulito #

<a href="#">link</a>

Chiudi, questo produce <a href="# ">link</a>per me.
tyler.frankenstein,

1

Userei invece il tipo di rendering html_tag perché credo che il link di rendering riceva un'attenzione speciale da Drupal. Il rovescio della medaglia è che non esiste una funzione scorciatoia per questo, quindi dovremo usare un array di rendering:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);

0

Questa è sostanzialmente la stessa risposta che ho postato qui ... L'impostazione fragmentsu un singolo spazio verrà convertita in a #, ed $current_pathè inclusa perché altrimenti il ​​link verrà semplicemente impostato www.example.com/#invece di www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));

Non è necessario ottenere l'alias del percorso perché l () verrà convertito in alias per te. In realtà è preferibile utilizzare un percorso senza alias.
Rooby
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.