Extra Form
PHP PHP 7.1
CMS XpressEngine

이전에 게시판을 업그레이드 해서 그런지 한 달 전부터

버튼을 눌러도 반응이 없었다는 것을 어제 알게되었습니다.

소스를 봐도 이상한게 없는 것 같은데,

웹브라우저 개발자화면의 에러메세지가

이게 맞는 건지 알 수가 없네요...

견적신청 버튼을 눌러도 양식을 다 채우지 않았는데도 에러도 안 나오고,

메일도 안보내지고... 

뭐가 문제인지 말씀과 조언 부탁드립니다.

 

err1.jpg

err2.jpg

 

  • profile
    jQuery(function($)

    로 바꿔보세요. XE에서는 $로 단축해서 쓸수 없습니다.
  • profile profile
    jQuery(function($){
    $("#btnEs").click(function(){
    sendMailEstimate();
    return false;
    });
    $("#btnTech").click(function(){
    sendMailTech();
    return false;
    });
    });

    이렇게 수정했는데요, 아직 동작을 안합니다..
    이상한게요, 이 부분도 수정을 한 적이 없는데,
    소스코드가 바뀔수도 있나요?
  • profile profile

    소스가 바뀔리가요. 원래부터 그렇게 되어있었겠죠.

    $ is not a function

     

    $는 함수가 아니라고 하는 오류 아닌가요.....

  • profile profile
    위에도 모두 $로 되어 있는 것을 보니 원래 $라고 써도 작동하는 소스인가 봅니다.
    그렇다면 jQuery를 건드리는 다른 자료를 최근에 설치/업데이트한 것이 원인일 수도 있어요.
  • profile profile

    그렇다면 오토링크 애드온 해제해 보세요. 제가 알기로는 그 애드온이 잘못 만들어져 코어에서 불러오는 공통스크립트를 불러오는 거로 압니다. 거기서 충돌이 날 수 있어요. @빌리지

    -- 어 그런데 오토링크 애드온 열어보니 모바일일때만 불러오도록 되어 있어 PC에서도 문제가 생기니 이건 추가적인 또다른 문제가 있네요. 어찌되었던 오토링크에서 공통스크립트 불러오는건 지워야 합니다.

  • profile profile
    캡챠 애드온도 같은 문제가 있는데 이것도 마찬가지로 모바일에서만 문제를 일으킬텐데... 흠....
  • profile profile

    err3.jpg

    웹지기님 말씀대로 해제했습니다.. 아직 작동은 안하고 있습니다..

    소스 수정한 적이 없으니 충돌문제가 확실한 것 같습니다.

  • profile profile
    제가 말한대로 소스도 고쳐놓으면 에러가 계속 뜨나요 ? 캡챠 애드온도 해제해 보시구요.
  • profile profile

    err4.jpg

    jQuery(function($){
        $("#btnEs").click(function(){
            sendMailEstimate();
            return false;
        });
        $("#btnTech").click(function(){
            sendMailTech();
            return false;
        });
    });
     

    네... 애드온과 위 소스대로 적용해보았지만..아직 버튼이 작동을 안하고 있습니다.

  • profile profile

    저는 소스가 그대로 인데요... 브라우저 캐시 때문인가 보네요. 제가 캐시를 초기화 해봐야 겠네요.

    캐시 초기화 해보고 비교해 보세요.

  • profile profile

    브라우저 컨트롤 F5로 새로고침 하니 새로운 파일반영되서 일단 에러는 없어졌습니다.

     

    나머지 글 작성하고 버튼 누르고 또 에러가 나는건 같은 $의 문제가 아닌가 하는데 저도 개발자가 아니라 이부분은 어떻게 전부 일괄적으로 고치는지는 다른 개발자분이 답변주시면 좋겠네요. 함수 끝부분에 jQuery 를 선언해 주는거 같던데요...

  • profile profile
    네...알겠습니다.
  • profile profile

    다른 질문글을 보니
    (function($){

    내용

    })(jQuery);

    이렇게 $가 등장하는 곳을 감싸주는 듯 합니다. 참고적으로만....

     

    https://xetown.com/questions/146140

  • profile profile
    qna.js 소스가 그렇게 길지는 않는데, 다른것과 호환이 안되나봅니다.
    소스한번 올려봅니다.

    function sendMailEstimate(){
    //estimateForm
    var aData = {
    type:"es",
    com:$("[name='es_com']").val(),
    dept:$("[name='es_dept']").val(),
    name:$("[name='es_name']").val(),
    email:$("[name='es_mail']").val(),
    tel:$("[name='es_tel']").val(),
    prd:$("[name='es_prd']").val(),
    cont:$("[name='es_cont']").val()
    }

    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    }

    function sendMailTech(){
    //techForm
    var aData = {
    type:"tech",
    com:$("[name='te_com']").val(),
    dept:$("[name='te_dept']").val(),
    name:$("[name='te_name']").val(),
    email:$("[name='te_mail']").val(),
    tel:$("[name='te_tel']").val(),
    prd:$("[name='te_prd']").val(),
    firm:$("[name='te_firm']").val(),
    cont:$("[name='te_cont']").val()
    }
    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    }

    function formValidation(obj){
    for ( b in obj ){
    if ( obj[b] === "" || obj[b] === null || obj[b] === undefined ) {
    console.log(obj[b], b);
    alert("빈칸을 채워주세요.");
    return false;
    }
    }
    return true;
    }

    jQuery(function($){
    $("#btnEs").click(function(){
    sendMailEstimate();
    return false;
    });
    $("#btnTech").click(function(){
    sendMailTech();
    return false;
    });
    });
  • profile profile
    다른것과 호환이 아니고 XE에서 $ 로 줄여서 못씁니다. 위에 댓글대로 고쳐보세요.
  • profile profile
    (function($){

    내용

    })(jQuery);


    jQuery(function($){

    }

    두개가 같은 것 같습니다. 방법의 차이로 보이구요. 나머지 함수중 $가 등장하는 함수 전체를

    (function($){

    내용

    })(jQuery);


    로 감싸보세요.
  • ?
    <a id="btnEs" href="#">☞ 견적신청</a> 이렇게 되어있는데요?
  • ? profile
    네?
    이 부분은 수정한 적이 없는데 잘못된 부분이 있는지요?
  • profile ?
    저야 모르죠. 소스검사해보면 저리 나오니..
  • profile
    qna.js 의 sendMailEstimate 함수를 아래와 같이 바꿔보세요.
    $ 를 jQuery로 바꾸시면 됩니다.

    function sendMailEstimate(){
    //estimateForm
    var aData = {
    type:"es",
    com: jQuery("[name='es_com']").val(),
    dept: jQuery("[name='es_dept']").val(),
    name: jQuery("[name='es_name']").val(),
    email:jQuery("[name='es_mail']").val(),
    tel:jQuery("[name='es_tel']").val(),
    prd:jQuery("[name='es_prd']").val(),
    cont:jQuery("[name='es_cont']").val()
    }
    }

    이렇게 바꿀 경우 버튼이 작동하는 것 같네요.
  • profile profile
    모두 바꾸는거보다
    (function($){

    내용

    })(jQuery);

    이게 더 쉽지 않나요? ㅋㅋ
  • profile profile
    function sendMailEstimate(){
    (function($) {
    //estimateForm
    var aData = {
    type:"es",
    com:$("[name='es_com']").val(),
    dept:$("[name='es_dept']").val(),
    name:$("[name='es_name']").val(),
    email:$("[name='es_mail']").val(),
    tel:$("[name='es_tel']").val(),
    prd:$("[name='es_prd']").val(),
    cont:$("[name='es_cont']").val()
    }

    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    })(jQuery)
    }

    그럼 이렇게 바꾸면 되겠네요.
    이게 더 나아보이는 군요.
    어쨌든 conflict는 $("...").val() 여기서 났으니 여기를 해결하면 되겠네요.
  • profile profile
    function sendMailEstimate(){
    (function($) {
    //estimateForm
    var aData = {
    type:"es",
    com:$("[name='es_com']").val(),
    dept:$("[name='es_dept']").val(),
    name:$("[name='es_name']").val(),
    email:$("[name='es_mail']").val(),
    tel:$("[name='es_tel']").val(),
    prd:$("[name='es_prd']").val(),
    cont:$("[name='es_cont']").val()
    }

    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    })(jQuery);
    }

    function sendMailTech(){
    //techForm
    var aData = {
    type:"tech",
    com:$("[name='te_com']").val(),
    dept:$("[name='te_dept']").val(),
    name:$("[name='te_name']").val(),
    email:$("[name='te_mail']").val(),
    tel:$("[name='te_tel']").val(),
    prd:$("[name='te_prd']").val(),
    firm:$("[name='te_firm']").val(),
    cont:$("[name='te_cont']").val()
    }
    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    }

    function formValidation(obj){
    for ( b in obj ){
    if ( obj[b] === "" || obj[b] === null || obj[b] === undefined ) {
    console.log(obj[b], b);
    alert("빈칸을 채워주세요.");
    return false;
    }
    }
    return true;
    }

    (function($){
    $("#btnEs").click(function(){
    sendMailEstimate();
    return false;
    });
    $("#btnTech").click(function(){
    sendMailTech();
    return false;
    });
    })(jQuery);

    아직 버튼이 작동 안하고 있습니다.
    무엇이 문제인지... 너무 고민됩니다...
  • profile profile
    function formValidation(obj){
    (function($) {
    for ( b in obj ){
    if ( obj[b] === "" || obj[b] === null || obj[b] === undefined ) {
    console.log(obj[b], b);
    alert("鍮덉뭏�� 梨꾩썙二쇱꽭��.");
    return false;
    }
    }
    return true;
    })(jQuery);
    }

    이부분은 필요 없어 보이는데 여기는 원래대로 해보시는게 좋을 것 같네요.
    이 함수가 위 조건에 들어가는데 여기가 이상하면 클릭을 해도 전송을 하지 않을 것 같습니다.
  • profile profile

    웹지기님 말씀대로
    (function($) { 내용은 그대로 두고 })(jQuery);
    그 부분 내용은 그대로 두고 펑션과 제이쿼리를 빼봤습니다.
    아직 버튼이 작동을 ㅜㅜ...
    너무 어렵네요..

     

    혹신 연관된 파일들의 function 부분을 모두

    (function($) { 내용은 그대로 두고 })(jQuery);

    이렇게 감싸보면 해결이 될 수 있을까요?

  • profile profile
    구글링을 해보니 엘리먼트가 나중에 나타나면 클릭 이벤트가 실행이 안된다고 하는 문서도 있습니다.
    js를 html이 출력된 후 뒤에 로딩되도록 위치를 바꿔 보실 수 있나요 ? 스크립트를 어떻게 불러오는지 모르겠습니다만...
  • profile
    하...ㅜㅜ
    qna.js에 (function($) { 내용은 그대로 두고 })(jQuery); 감싸고,
    여기서 참조하는 ajax_func.php 파일에는 function이 없고,

    ajax_func.php 파일에서 참조하는 PHPMailerAutoload.php 파일에
    아래와 같이 감쌌는데도 이 버튼이 반응이 없네요.

    function PHPMailerAutoload($classname)
    {
    (function($) {
    //Can't use __DIR__ as it's only in PHP 5.3+
    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
    if (is_readable($filename)) {
    require $filename;
    }
    })(jQuery);
    }

    if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
    //SPL autoloading was introduced in PHP 5.1.2
    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
    spl_autoload_register('PHPMailerAutoload', true, true);
    } else {
    spl_autoload_register('PHPMailerAutoload');
    }
    } else {
    /**
    * Fall back to traditional autoload for old PHP versions
    * @param string $classname The name of the class to load
    */
    function __autoload($classname)
    {
    (function($) {
    PHPMailerAutoload($classname);
    })(jQuery);
    }
    }
  • profile profile
    지금 불필요한 일을 하고 계십니다. jQuery $ 에 필요한 경우만 하셔야죠. 다른 파일은 왜........
  • profile profile

    위에 댓글로 알려드린 js 파일 로드를 html 뒷단에 위치하도록 바꿔보세요.

    스크립트 위치를 아래쪽으로 바꾸기 어려우시다면..

     

    jQuery(document).ready(function($){
        $("#btnEs").click(function(){
            sendMailEstimate();
            return false;
        });
        $("#btnTech").click(function(){
            sendMailTech();
            return false;
        });
    });

     

    이렇게 고쳐보시는게 좋을 것 같습니다.

  • profile profile
    현재 click 이벤트 자체가 실행이 안되는 거 같네요.
    일단 건드린 설정 다시 되돌리시고 제가 말한 sendMailEstimate 함수만 한번 고쳐보세요.
    분명 제가 했을 때는 이벤트는 정상적으로 작동했습니다.
    그리고 해당 부분을 고쳤을 때는 값을 입력하라고 정상적으로 경고창이 떴었습니다.
  • profile profile
    말씀대로 바꿔보려했는데
    어디를 손대야할지 모르겠네요...^^
  • profile profile
    맨 아래 함수요. 클릭이벤트 함수부분입니다.
  • profile profile
    네...말씀대로 이렇게 바꿨었습니다만...
    저는 클릭버튼이 동작을 안합니다..

    function sendMailTech(){
    (function($) {
    //techForm
    var aData = {
    type:"tech",
    com:$("[name='te_com']").val(),
    dept:$("[name='te_dept']").val(),
    name:$("[name='te_name']").val(),
    email:$("[name='te_mail']").val(),
    tel:$("[name='te_tel']").val(),
    prd:$("[name='te_prd']").val(),
    firm:$("[name='te_firm']").val(),
    cont:$("[name='te_cont']").val()
    }
    if ( formValidation(aData) ) {
    $.ajax({
    url : "/tools/mailer/ajax_func.php",
    data:aData,
    type:"POST",
    success:function(e){
    alert(e);
    }
    });
    }
    })(jQuery);
    }
  • profile profile
    밑져야 본전이니 맨 아래 클릭함수
    jQuery(document).ready(function($){
    $("#btnEs").click(function(){
    sendMailEstimate();
    return false;
    });
    $("#btnTech").click(function(){
    sendMailTech();
    return false;
    });
    });

    이렇게 고쳐보세요. jQuery 클릭이벤트 id 의 경우 엘리먼트가 나중에 나오면 클릭이 이벤트가 동작이 안된답니다.
  • profile profile
    웹지기님... 버튼이 작동하네요...??
    헉...이거 무슨 마법인지요?
    이럴수가........
  • profile profile
    고치신거 확인하고 강력한 새로고침 후 시도해보니 이제 잘되네요.
    jQuery 클릭이벤트 id 의 경우 엘리먼트가 나중에 나오면 클릭이 이벤트가 동작하지 않는게 맞네요.

    이부분 엘리먼트가 모두 나온 후 js가 동작하도록 고치고 잘 됩니다.
  • profile profile
    원래부터 스크립트 로드 순서가 잘못되어있었고. jQuery 사용이 XE에 맞지 않게 되어있었습니다. 복합적인 문제인데 결국 해결이 된 겁니다.
  • profile profile
    jQuery(document).ready(function($){

    이 한 줄만 고쳤을 뿐인데... 엘리먼트가 어느부분이에요?
  • profile profile
    고치셨다니 다행입니다.
    스크립트 로드 순서 때문에 이벤트가 발생이 안된거 같고, $ 사용으로 인해 form 값이 제대로 전달이 안 됐던것 같습니다.
    웨일로 보다가 크롬으로 보는데 갑자기 되서 놀랐습니다.ㅎㅎ
  • profile profile
    설명을 쉽게 해 드리면 엘리먼트라고 표현하는것은 div p 이런 단위를 일컷습니다.

    그런데 클릭이벤트때 엘리먼트 id를 체크하게 되어있습니다. 견적신청 a 요소에 id 로 지정하셨습니다.

    이 부분보다 jQuery 클릭이벤트 함수가 위에 나오면 클릭이벤트가 실행되지 않는다고 합니다.
    그래서 스크립트를 html 뒷쪽에서 로드해달라고 요청드렸으나 어려우신 것 같아..

    제가...
    html 부분이 모두 출력된 후 동작할 수 있도록 jQuery(document).ready(function($) 바꿔 드린 것 입니다.

    이전에 동작했던게 여러가지 다른 자료와 충돌 등 이상한 상황에서 동작이 되었던 것 같네요.
  • profile profile
    리포지토리님 감사합니다..
    주셨던 말씀 도움이 많이 되었습니다.
    정말 고맙습니다.
  • profile profile
    하...웹지기님이 안계셨더라면...ㅜㅜ
    정말 감사합니다..
    이 은혜 어찌 보답할 수 있을까요? ㅜㅜ
  • profile profile
    다른 고수분들이 대신 저에게 많은 해답을 주고 계시니 저는 그분들께 보답을 받고 있고 앞으로도 받겠습니다 ㅋ
    빌리지님께서는 다른 분이 비슷한 어려움을 겪고 계신게 발견되면 그때 짠 하고 도와주세요 ㅋ
  • profile profile
    웹지기님 말씀 잘 새겨듣겠습니다.
    제 쪽지 좀 확인해주세요.
  • profile profile
    뭐 쪽지는 봤지만 뭐 그냥 여기가 그런 곳이니 특별히 생각은 안하셔도 될 것 같습니다. 저는 솔직히 그렇습니다. 질문 자체가 성의가 있다면 답변도 성의가 있는 것이고 그런 것을 가능하게 하려고 만들어진 곳이 이곳이니 그냥 여기서 할 수 있는 그런 것을 부담없이 편히 이용하면 그만이라고 생각합니다. 따로 쪽지에 대한 회신은 해드리지 않을게요. 뭐 덕분에 저도 오늘 새로운 사실을 의도치 않게 알게 되어 좋습니다 ㅋ
  • profile profile
    네...알겠습니다.
    웹지기님에 대해 궁금한 점은 많지만요...
    정말 감사합니다...^^