CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.1 |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
이전에 게시판을 업그레이드 해서 그런지 한 달 전부터
버튼을 눌러도 반응이 없었다는 것을 어제 알게되었습니다.
소스를 봐도 이상한게 없는 것 같은데,
웹브라우저 개발자화면의 에러메세지가
이게 맞는 건지 알 수가 없네요...
견적신청 버튼을 눌러도 양식을 다 채우지 않았는데도 에러도 안 나오고,
메일도 안보내지고...
뭐가 문제인지 말씀과 조언 부탁드립니다.
댓글 46
로 바꿔보세요. XE에서는 $로 단축해서 쓸수 없습니다.
$("#btnEs").click(function(){
sendMailEstimate();
return false;
});
$("#btnTech").click(function(){
sendMailTech();
return false;
});
});
이렇게 수정했는데요, 아직 동작을 안합니다..
이상한게요, 이 부분도 수정을 한 적이 없는데,
소스코드가 바뀔수도 있나요?
소스가 바뀔리가요. 원래부터 그렇게 되어있었겠죠.
$ is not a function
$는 함수가 아니라고 하는 오류 아닌가요.....
그렇다면 jQuery를 건드리는 다른 자료를 최근에 설치/업데이트한 것이 원인일 수도 있어요.
그렇다면 오토링크 애드온 해제해 보세요. 제가 알기로는 그 애드온이 잘못 만들어져 코어에서 불러오는 공통스크립트를 불러오는 거로 압니다. 거기서 충돌이 날 수 있어요. @빌리지
-- 어 그런데 오토링크 애드온 열어보니 모바일일때만 불러오도록 되어 있어 PC에서도 문제가 생기니 이건 추가적인 또다른 문제가 있네요. 어찌되었던 오토링크에서 공통스크립트 불러오는건 지워야 합니다.
웹지기님 말씀대로 해제했습니다.. 아직 작동은 안하고 있습니다..
소스 수정한 적이 없으니 충돌문제가 확실한 것 같습니다.
jQuery(function($){
$("#btnEs").click(function(){
sendMailEstimate();
return false;
});
$("#btnTech").click(function(){
sendMailTech();
return false;
});
});
네... 애드온과 위 소스대로 적용해보았지만..아직 버튼이 작동을 안하고 있습니다.
저는 소스가 그대로 인데요... 브라우저 캐시 때문인가 보네요. 제가 캐시를 초기화 해봐야 겠네요.
캐시 초기화 해보고 비교해 보세요.
다른 질문글을 보니
(function($){
내용
})(jQuery);
이렇게 $가 등장하는 곳을 감싸주는 듯 합니다. 참고적으로만....
https://xetown.com/questions/146140
소스한번 올려봅니다.
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;
});
});
내용
})(jQuery);
jQuery(function($){
}
두개가 같은 것 같습니다. 방법의 차이로 보이구요. 나머지 함수중 $가 등장하는 함수 전체를
(function($){
내용
})(jQuery);
로 감싸보세요.
브라우저 컨트롤 F5로 새로고침 하니 새로운 파일반영되서 일단 에러는 없어졌습니다.
나머지 글 작성하고 버튼 누르고 또 에러가 나는건 같은 $의 문제가 아닌가 하는데 저도 개발자가 아니라 이부분은 어떻게 전부 일괄적으로 고치는지는 다른 개발자분이 답변주시면 좋겠네요. 함수 끝부분에 jQuery 를 선언해 주는거 같던데요...
이 부분은 수정한 적이 없는데 잘못된 부분이 있는지요?
$ 를 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()
}
}
이렇게 바꿀 경우 버튼이 작동하는 것 같네요.
(function($){
내용
})(jQuery);
이게 더 쉽지 않나요? ㅋㅋ
(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() 여기서 났으니 여기를 해결하면 되겠네요.
(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);
아직 버튼이 작동 안하고 있습니다.
무엇이 문제인지... 너무 고민됩니다...
(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);
}
이부분은 필요 없어 보이는데 여기는 원래대로 해보시는게 좋을 것 같네요.
이 함수가 위 조건에 들어가는데 여기가 이상하면 클릭을 해도 전송을 하지 않을 것 같습니다.
웹지기님 말씀대로
(function($) { 내용은 그대로 두고 })(jQuery);
그 부분 내용은 그대로 두고 펑션과 제이쿼리를 빼봤습니다.
아직 버튼이 작동을 ㅜㅜ...
너무 어렵네요..
혹신 연관된 파일들의 function 부분을 모두
(function($) { 내용은 그대로 두고 })(jQuery);
이렇게 감싸보면 해결이 될 수 있을까요?
js를 html이 출력된 후 뒤에 로딩되도록 위치를 바꿔 보실 수 있나요 ? 스크립트를 어떻게 불러오는지 모르겠습니다만...
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);
}
}
위에 댓글로 알려드린 js 파일 로드를 html 뒷단에 위치하도록 바꿔보세요.
스크립트 위치를 아래쪽으로 바꾸기 어려우시다면..
jQuery(document).ready(function($){
$("#btnEs").click(function(){
sendMailEstimate();
return false;
});
$("#btnTech").click(function(){
sendMailTech();
return false;
});
});
이렇게 고쳐보시는게 좋을 것 같습니다.
일단 건드린 설정 다시 되돌리시고 제가 말한 sendMailEstimate 함수만 한번 고쳐보세요.
분명 제가 했을 때는 이벤트는 정상적으로 작동했습니다.
그리고 해당 부분을 고쳤을 때는 값을 입력하라고 정상적으로 경고창이 떴었습니다.
저는 클릭버튼이 동작을 안합니다..
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);
}
jQuery 클릭이벤트 id 의 경우 엘리먼트가 나중에 나오면 클릭이 이벤트가 동작하지 않는게 맞네요.
이부분 엘리먼트가 모두 나온 후 js가 동작하도록 고치고 잘 됩니다.
어디를 손대야할지 모르겠네요...^^
헉...이거 무슨 마법인지요?
이럴수가........
이 한 줄만 고쳤을 뿐인데... 엘리먼트가 어느부분이에요?
그런데 클릭이벤트때 엘리먼트 id를 체크하게 되어있습니다. 견적신청 a 요소에 id 로 지정하셨습니다.
이 부분보다 jQuery 클릭이벤트 함수가 위에 나오면 클릭이벤트가 실행되지 않는다고 합니다.
그래서 스크립트를 html 뒷쪽에서 로드해달라고 요청드렸으나 어려우신 것 같아..
제가...
html 부분이 모두 출력된 후 동작할 수 있도록 jQuery(document).ready(function($) 바꿔 드린 것 입니다.
이전에 동작했던게 여러가지 다른 자료와 충돌 등 이상한 상황에서 동작이 되었던 것 같네요.
정말 감사합니다..
이 은혜 어찌 보답할 수 있을까요? ㅜㅜ
빌리지님께서는 다른 분이 비슷한 어려움을 겪고 계신게 발견되면 그때 짠 하고 도와주세요 ㅋ
제 쪽지 좀 확인해주세요.
웹지기님에 대해 궁금한 점은 많지만요...
정말 감사합니다...^^
스크립트 로드 순서 때문에 이벤트가 발생이 안된거 같고, $ 사용으로 인해 form 값이 제대로 전달이 안 됐던것 같습니다.
웨일로 보다가 크롬으로 보는데 갑자기 되서 놀랐습니다.ㅎㅎ
주셨던 말씀 도움이 많이 되었습니다.
정말 고맙습니다.
jQuery(document).ready(function($){
$("#btnEs").click(function(){
sendMailEstimate();
return false;
});
$("#btnTech").click(function(){
sendMailTech();
return false;
});
});
이렇게 고쳐보세요. jQuery 클릭이벤트 id 의 경우 엘리먼트가 나중에 나오면 클릭이 이벤트가 동작이 안된답니다.