l ()로 EMPTY 앵커 전용 링크를 만드는 방법은 무엇입니까?


20

아약스 호출 목적으로 l()와 같은 것을 얻기 위해 사용하려고 <a href='#' ...>합니다. /programming/1698453/drupal-creating-anchor-only-link-with-l은 에서 옵션을 사용 - 매우 가까운 옳은 일을하는 것입니다 l()같은 'fragment' => 'foo'같은 링크를 생성하는 <a href='#foo'...>-하지만 난 깨끗한 '#'을 얻으려고합니다. 이것을 할 수있는 방법이 있습니까, 아니면 조각의 일부로 무언가를 넣고 걱정하지 않아도됩니까?

답변:


12

조각과 함께 깨끗한 "#"을 사용할 수 없다면을 사용하는 것이 좋습니다 <a href="javascript:">link</a>.
"javascript :"또는 "javascript : void (0)"를 href속성에 추가하면 <a>태그가 아무 작업도 수행하지 않습니다. 그런 다음 "onclick"을 아약스 용 링크에 바인딩 할 수 있습니다. 다음과 같은 기능을
사용하여이를 구현할 수 있습니다 l().

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

무엇에 대해javascript:void(0)
— Serjas

1
@Serjas javascript:와 javascript:void(0)동일합니다. 유일한 차이점은 "void (0)"입니다. :)
— Sithu

나는 l ()이 ()를 변환 할 것인가?
— Serjas

6
그런 shenanigans를 사용해서는 안되며 이벤트 중심 JavaScript를 사용해야합니다! 이것은 2004 년이 아닌 2012 년입니다. 왜 저품질 응답이 투표됩니까? 쉬워서 인기가 있습니까? 그러나 매우 잘못되었습니다. :(

@chx, drupal 핵심 관리자이므로 경로 또는 조각 대신 l () 함수에 두 번째 매개 변수를 사용하지 않기를 바랍니다. 불행히도이 함수는 "javascript"를 경로로 받아들입니다. 아마도 Drupal 이후 버전에서는 제한 될 것입니다.
— Sithu

15

PHP 타입 캐스팅 팝 퀴즈 시간! (전체 공개 : 저는 사무실에서 이기지 못했습니다).

이미 지적했듯이, 이것은 l()우리가 우려 하는 코드 입니다.

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

질문은 다음과 같습니다. 어떤 값이 빈 문자열로 변환되지만 다음을 통과합니까?

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

대답은 : FALSE!

그래서 우리는 이것을 시도 할 수 있습니다 :

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

우리에게주는 것 :

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

고맙게도 다음과 external => TRUE같이 전달하여 슬래시를 제거 할 수 있습니다 .

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

우리에게주는 것 :

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

팔. html 문자열을 수동으로 연결하지 않으려면 어떻게해야합니까?

추신:

실제로 정상적인 상황에서 PHP에서 이와 같은 링크를 인쇄하는 것이 좋습니다. 자바 스크립트가 없으면 모든 링크가 사용자를 페이지 맨 위로 이동시킵니다 ( 약간의 놀랍게도 행동이 지정됩니다 ). 아마도 자바 스크립트없이 작동하는 곳을 가리켜 야합니다.

링크가 실제로 자바 스크립트에서만 이해되는 경우 (js 전용 슬라이드 쇼 또는 기타 컨트롤과 같은) 자바 스크립트로 페이지에 링크를 추가하는 것이 좋습니다. 또는 소스에 실제로 넣으려면 display:none기본적으로 'd' 인지 확인하십시오 . Drupal은 .jshtml에 클래스가있어 자바 스크립트가있을 때이를 보여줍니다.


7

불행히도 url()( l()내부적 으로 호출 되는) 함수 는 다음 줄로 빈 조각이 생길 가능성이 거의 없습니다.

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

프래그먼트가 빈 문자열이 아닌지 확인하여 깨끗한 상태를 유지하기 위해 전달해야합니다 #. 가장 쉬운 해결책은 페이지 어딘가에 적절한 요소의 ID를 선택하고 대신 조각에 사용하는 것입니다 (또는 javascript:voidSithu가 언급했듯이).

그러나 ... 가장 접근하기 쉬운 방법 (그리고 많은 국가에서 합법적 인 방법; 미국의 508 항 , 영국 의 DDA 등을 생각 하십시오 )은 귀하의 링크에 의해로드 / 조정되는 내용을 제공하는 것입니다 별도의 페이지를 사용하고 대신 해당 페이지의 URL을 링크의 href로 사용하십시오. 그런 다음 javascript를 사용하여 링크의 이벤트가 활성화 된 브라우저의 페이지를 실제로 리디렉션하지 못하게합니다.

그렇게하면 자바 스크립트가없는 사용자에게 대체 콘텐츠가 있고 합법적이며 모든 사람과 개를 행복하게 유지합니다 :)


폴백에 대한 훌륭한 편집! 링크의 href에서 ajax URL을 사용하는 경우 자바 스크립트가 비활성화 된 경우 호출 페이지가 렌더링 가능한 HTML이 될 수 있습니까? 내가 가졌던 print drupal_json_output($output)내 아약스 호출 페이지에서.
— Sithu

4

clean 사용할 수 없습니다 #.

그러나 추가하는 것이 가능 space symbol한 후 #:

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

2

방금 같은 문제가 있었지만 해결책 중 어느 것도 만족스럽지 않았으므로 내 자신의 것을 생각해 냈습니다.

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

이것은 깨끗한 생산 #

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

닫기, 이것은 <a href="# ">link</a>나를 위해 생산 합니다.
— tyler.frankenstein

1

렌더 링크 가 Drupal의 특별한 관심을 받기 때문에 렌더 유형 html_tag를 대신 사용 합니다. 단점은 바로 가기 기능이 없으므로 렌더 배열을 사용해야한다는 것입니다.

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

0

이것은 기본적으로 내가 게시 된 같은 대답은 여기에 설정 ... fragmentA를 변환하는 하나의 공간으로 #하고, $current_path그렇지 않으면 링크가 단지로 설정되기 때문에 포함되는 www.example.com/#대신 www.example.com/current-page#:

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

l ()이 별명으로 변환되므로 경로 별명을 가져올 필요가 없습니다. 실제로 앨리어싱되지 않은 경로를 사용하는 것이 좋습니다.
— rooby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.