Jak utworzyć PUSTY link tylko do kotwicy za pomocą l ()?

20

Próbuję użyć, l()aby uzyskać coś takiego <a href='#' ...>, do celów wywoływania ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l jest bardzo blisko do właściwej rzeczy - użyj opcji w l()jak 'fragment' => 'foo'produkować link podobnego <a href='#foo'...>- ale jestem próbuje uzyskać czyste „#”. Czy jest jakiś sposób, aby to zrobić, czy powinienem po prostu włożyć coś w ramach fragmentu i nie martwić się o to?

Jim Miller
źródło

Odpowiedzi:

12

Jeśli nie możesz użyć czystego „#” z fragmentem, radzę użyć <a href="javascript:">link</a>.
Dodając do hrefatrybutu „javascript:” lub „javascript: void (0)” , <a>tag nic nie zrobi. Następnie możesz powiązać „onclick” z linkiem dla swojego celu aukcji.
Możesz to zaimplementować za pomocą l()funkcji, jak poniżej:

     l('link', 'javascript:',  array('external' => TRUE));
Sithu
źródło
a co zjavascript:void(0)
Serjas
1
@Serjas javascript:i javascript:void(0)są takie same. Jedyną różnicą jest „void (0)” :)
Sithu
Mam na myśli to, czy l () convert ()?
Serjas
6
Nigdy nie powinieneś nigdy używać takich shenaniganów i po prostu używać JavaScript sterowanego zdarzeniami! To rok 2012, a nie rok 2004. Dlaczego głosuje się na tak niską jakość odpowiedzi? Popularny, bo to łatwe? Ale to bardzo źle. :(
@chx, jako że jesteś opiekunem rdzenia drupal, mam nadzieję, że nie nadużywasz tego, że nie używasz drugiego parametru funkcji l () zamiast ścieżki lub fragmentu. Niestety funkcja akceptuje „javascript” jako ścieżkę :) Jeśli jest to bardzo źle, dlaczego Drupal ją akceptuje. Prawdopodobnie będzie ograniczony w późniejszych wersjach Drupala.
Sithu,
15

Czas na quiz pop typecasting PHP! (Pełne ujawnienie: nie wygrałem w naszym biurze).

Jak już wspomniano, jest to kod l(), który dotyczy:

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

Oto pytanie: jaka wartość jest rzutowana na pusty ciąg, ale przekazuje następujące?

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

Odpowiedź brzmi FALSE:!

Więc możemy spróbować tego:

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

Co daje nam:

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

Na szczęście możemy usunąć to wiodące cięcie, przekazując external => TRUE:

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

Co daje nam:

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

Bum. Rzeczy, które robimy, aby uniknąć łączenia łańcuchów HTML ręcznie, co?

Postscriptum:

Nie jestem pewien, czy poleciłbym wydrukowanie takiego linku z php w normalnych okolicznościach. Bez twojego javascript, cały ten link spowoduje, że przeskoczysz użytkownika na górę strony ( co, ku mojemu zaskoczeniu, jest sprecyzowanym zachowaniem ). Prawdopodobnie powinien wskazywać gdzieś, co działa bez javascript.

Jeśli link naprawdę ma sens tylko w javascript (jak formanty pokazu slajdów w js lub coś takiego), myślę, że lepiej jest dodać link do strony za pomocą javascript. Alternatywnie, jeśli naprawdę chcesz umieścić go w swoim źródle, upewnij się, że jest to display:nonedomyślnie. Drupal ma .jsklasę w html do pokazania go, gdy jest w pobliżu javascript.

Stephen Tweeddale
źródło
7

Niestety url()funkcja (która l()wywołuje wewnętrznie) praktycznie nie ma szans na pusty fragment z następującymi liniami:

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

Sprawdza, czy fragment nie jest pustym ciągiem, który należy przekazać, aby uzyskać czysty #. Myślę, że najłatwiejszym rozwiązaniem byłoby wybranie identyfikatora odpowiedniego elementu gdzieś na stronie i użycie go zamiast tego dla fragmentu (lub javascript:voidjak wspomniał Sithu).

Jednak ... najbardziej dostępnym sposobem (a następnie, w wielu krajach, legalnym sposobem; pomyśl sekcja 508 w Stanach Zjednoczonych, DDA w Wielkiej Brytanii itp.) Byłoby dostarczenie treści, która jest ładowana / dostosowywana przez twój link na oddzielną stronę i zamiast tego użyj adresu URL tej strony jako odnośnika do linku. Następnie użyłbyś javascript, aby powstrzymać zdarzenie w linku od przekierowania strony dla tych przeglądarek, które mają go włączone.

W ten sposób masz wycofaną zawartość dla użytkowników bez javascript, pozostajesz legalny i sprawiasz, że wszyscy i ich pies są szczęśliwi :)

Clive
źródło
Świetna edycja o awariach! Jeśli użyjemy adresu URL ajax w hrefie linku, czy strona wywołująca może być renderowanym HTMLem, jeśli javascript jest wyłączony? Miałem kiedyś print drupal_json_output($output)na mojej stronie wywołującej ajax.
Sithu
4

Nie można użyć czystego #.

Ale można dodać space symbolpo #:

  l('Link title', '# ', array('external' => TRUE));
Milkovsky
źródło
2

Właśnie miałem ten sam problem, ale żadne z rozwiązań nie było satysfakcjonujące, więc wpadłem na swój własny:

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

To daje czyste #

<a href="#">link</a>
David Sidler
źródło
Zamknij, to <a href="# ">link</a>dla mnie produkuje .
tyler.frankenstein
1

Zamiast tego użyłbym typu renderowania html_tag, ponieważ uważam, że link renderowania zasługuje na szczególną uwagę ze strony Drupala. Minusem jest to, że nie ma dla niego funkcji skrótu, więc będziemy musieli użyć tablicy renderowania:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);
Jigarius
źródło
0

Jest to w zasadzie ta sama odpowiedź Zamieściłem tutaj ... Ustawienie fragmentdo jednego miejsca będą przekształcać się w #, i $current_pathjest wliczone w cenę, ponieważ w przeciwnym razie połączenie zostanie tylko ustawiony www.example.com/#zamiast www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));
jerdiggity
źródło
Nie ma potrzeby uzyskiwania aliasu ścieżki, ponieważ l () przekonwertuje się na alias dla Ciebie. W rzeczywistości lepiej jest użyć nie-aliasy ścieżki.
rooby