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.