পুনঃনির্দেশ ছাড়াই কীভাবে এইচটিএমএল ফর্ম জমা দিতে হয়


100

আমার যদি এর মতো একটি ফর্ম থাকে,

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>

জাভাস্ক্রিপ্ট / jQuery দ্বারা অন্য ভিউতে পুনর্নির্দেশ না করে আমি কীভাবে এটি জমা দিতে পারি?

আমি স্ট্যাক ওভারফ্লো থেকে প্রচুর উত্তর পড়েছি, কিন্তু সেগুলি সমস্তই আমাকে পোস্ট ফাংশন দিয়ে ফিরে আসা দর্শনে পুনর্নির্দেশ করে।


আপনি একটি এক্সএইচআর অনুরোধ চান (এজেএক্স)
স্টার্লিং আর্চার

4
এক্সএইচআর / এজেএক্স একটি উপায় - এটি পোস্ট জমা দেয় এবং পর্দার আড়ালে প্রতিক্রিয়া পায়, তাই ব্রাউজারটি কখনও পৃষ্ঠাটি ছেড়ে দেয় না। আরেকটি উপায় হ'ল পোস্টটি প্রক্রিয়া করার পরে একটি সার্ভার-সাইড পুনর্নির্দেশ, যা আপনি কোন সার্ভার প্রযুক্তি ব্যবহার করছেন তার উপর নির্ভর করে।
স্টিফেন পি

@ স্টেফেনপ আমি এএসপি.নেট এমভিসি 5.1 ব্যবহার করি।
ডিউক নুকে

@ ডুক, আমি যা বলছি তা হচ্ছে একাধিক পদ্ধতির (এজাক্স বনাম সার্ভার-পুনঃনির্দেশ) এবং আপনার পছন্দ আপনার প্রয়োজনের উপর নির্ভর করে। আধুনিক সাইটগুলি সম্ভবত এজ্যাক্স করতে চাইবে। লক্ষণীয় যে, এই সব উত্তর বলছে আপনি প্রয়োজন jQuery এর মধ্যে মহান কিন্তু - jQuery এর দ্বারা আসলে,, অন্য কোন উপায়ে Ajax কি ... যদিও আমি প্রকৃতপক্ষে jQuery এর নিজেকে ব্যবহার করেন।
স্টিফেন পি

4
আমার উপায়টি সহজ পরিষ্কার এবং মার্জিত এবং এটি কোডের 2 লাইন। এটি কোনও স্ক্রিপ্ট ব্যবহার করে না এবং জাভাস্ক্রিপ্ট বন্ধ থাকলেও এটি HTML4 এবং এর উপরে কাজ করে।
ইসা চানজী

উত্তর:


75

আপনি যা চান তা অর্জন করতে আপনার নীচের মতো jQuery অ্যাজাক্স ব্যবহার করতে হবে :

$('#myForm').submit(function(e){
    e.preventDefault();
    $.ajax({
        url: '/Car/Edit/17/',
        type: 'post',
        data:$('#myForm').serialize(),
        success:function(){
            // Whatever you want to do after the form is successfully submitted
        }
    });
});

এটি ব্যবহার করে দেখুন:

function SubForm(e){
    e.preventDefault();
    var url = $(this).closest('form').attr('action'),
    data = $(this).closest('form').serialize();
    $.ajax({
        url: url,
        type: 'post',
        data: data,
        success: function(){
           // Whatever you want to do after the form is successfully submitted
       }
   });
}

চূড়ান্ত সমাধান

এটি নির্বিঘ্নে কাজ করেছে। আমি এই ফাংশন থেকে কলHtml.ActionLink(...)

function SubForm (){
    $.ajax({
        url: '/Person/Edit/@Model.Id/',
        type: 'post',
        data: $('#myForm').serialize(),
        success: function(){
            alert("worked");
        }
    });
}

এটি দুর্দান্ত কাজ করেছে সমস্যাটি হ'ল আমি চাই না যে এটি স্বয়ংক্রিয়ভাবে (সর্বদা) এইভাবে জমা দেওয়া হোক। আপনি নিজের উত্তরে পোস্ট করেছেন এই জিনিসগুলি করার জন্য একটি নামের সাথে একটি ফাংশন করতে চাই। সুতরাং আমি চাইলে এটিকে ফর্মটি পোস্ট করার জন্য ম্যানুয়ালি আহ্বান জানাতে পারি। নীচের মত আমি অনুরোধ করতে ফাংশনটির নাম দিতে পারি। @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
ডিউক নুকে

এটি কাজ করেছে:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
ডিউক নুকে

কিছু কারণে আপনার দ্বিতীয় সমাধানটি কাজ করে নি, তবে আমি সর্বশেষ মন্তব্যে পোস্ট করা একটি তা করেছে। আমি আপনার পোস্টের কারণগুলিতে আমার সমাধানটি যুক্ত করব কেবলমাত্র আপনার কারণেই আমি এটি অর্জন করতে পারি।
ডিউক নুকে

4
দ্বিতীয়টি পাশাপাশি কাজ করা উচিত, এর সাথে অন্য কিছু থাকতে পারে তবে আপনি যদি সমাধানটি খুঁজে পান তবে আমাদের এখনই সেই রাস্তাটি নামানোর দরকার নেই! খুশি এটি সাহায্য করেছে;)
আমিন জাফারি

ধন্যবাদ এই উত্তরটি আমাকে জমা দেওয়ার পরেও ফর্মের জায়গায় একটি কাস্টম পাঠ্য রাখতে সহায়তা করেছে
অনুপম

123

আপনি actionঅদৃশ্য ফর্মটি পুনর্নির্দেশ করে তা অর্জন করতে পারেন <iframe>। এটির জন্য কোনও জাভাস্ক্রিপ্ট বা অন্য কোনও ধরণের স্ক্রিপ্টের প্রয়োজন নেই।

<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe>

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>

4
এটা অসাধারণ. তবে ফর্মটি জমা দেওয়ার পরে আমি কীভাবে কিছু করতে পারি? অর্থাত্ ফর্মটির পাঠ্য ক্ষেত্রগুলি খালি থাকতে হবে, ফোকাসটি প্রথম ক্ষেত্রের দিকে ফিরে যায় ইত্যাদি etc.
প্রঞ্জল চোলধারা

4
জাভাস্ক্রিপ্ট কিছু ধরণের যে এটি করতে পারেন। শুধু পরিবর্তন <input type='submit'...করতে <input type='reset'যোগonclick='document.forms["myForm"].submit();'>
ইসা Chanzi

সুন্দর উত্তর! দুর্দান্ত কাজ করে
সাইবারাস

4
সতর্কতা অবলম্বন করুন, আপনার ফর্মটি ইফ্রেমে থাকা পৃষ্ঠাটি পুনরায় লোড করার সম্ভাবনা রয়েছে যা আপনি কোনও অ্যাপ্লিকেশন বা একটি বড় ওয়েবসাইট তৈরি করে দিলে পারফরম্যান্স সমস্যায় পড়তে পারে।
আলেকজান্দ্রে ডাব্রিকোর্ট

24

iFrameআপনার পৃষ্ঠার নীচে একটি লুকানো রাখুন এবং targetএটি আপনার আকারে:

<iframe name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe>

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm" target="hiddenFrame"> ... </form>

দ্রুত এবং সহজ। মনে রাখবেন যে targetবৈশিষ্ট্যটি এখনও ব্যাপকভাবে সমর্থিত (এবং এইচটিএমএল 5 তে সমর্থিত) রয়েছে, এটি এইচটিএমএল 4.01 এ অবমূল্যায়ন করা হয়েছিল।

সুতরাং আপনার ভবিষ্যত প্রমাণ হিসাবে সত্যই এজাক্স ব্যবহার করা উচিত।


এমডিএন অনুসারে, এর জন্য এই আচরণটি targetসম্পূর্ণ বৈধ, সুতরাং এজেএক্স এখনও alচ্ছিক।
ড্যানিয়েল ডি লিয়ন

22

যেহেতু সমস্ত বর্তমান উত্তরগুলি jQuery বা ট্রিকসটি iframe সহ ব্যবহার করে, তাই অনুমান করা হয়েছে যে কেবল সরল জাভাস্ক্রিপ্ট সহ পদ্ধতি যুক্ত করার কোনও ক্ষতি নেই:

function formSubmit(event) {
  var url = "/post/url/here";
  var request = new XMLHttpRequest();
  request.open('POST', url, true);
  request.onload = function() { // request successful
  // we can use server response to our request now
    console.log(request.responseText);
  };

  request.onerror = function() {
    // request failed
  };

  request.send(new FormData(event.target)); // create FormData from form that triggered event
  event.preventDefault();
}

// and you can attach form submit event like this for example
function attachFormSubmitEvent(formId){
  document.getElementById(formId).addEventListener("submit", formSubmit);
}

4
তোমাকে অনেক ধন্যবাদ!
জোশুয়া ইভান্স

আমি আমার টুপি আপনাকে টিপ। আমি কন্টেন্ট টাইপ = ভ্রান্ত প্যারামিটার দিয়ে এনজিঙ্ক্স ব্যাকএন্ডে একটি ফর্ম পাঠাতে কীভাবে jquery পেতে পারি তা জানার চেষ্টা করে ঘন্টা ব্যয় করেছি এবং ফলস্বরূপ সর্বদা একটি 415 পেতে পারি। এটিই ছিল আমার একমাত্র সমাধান যা আমার বিশেষ সমস্যা সমাধান করেছিল।
ব্যবহারকারী12066

8

ঠিক আছে, আমি আপনাকে এটি করার একটি যাদুবিদ্যার উপায় বলব না কারণ এটি নেই। আপনার যদি কোনও ফর্ম উপাদানটির জন্য অ্যাকশন অ্যাট্রিবিউট সেট থাকে তবে এটি পুনর্নির্দেশ করবে।

আপনি যদি এটি পুনঃনির্দেশ করতে না চান তবে কোনও ক্রিয়া সেট করে নিবেন না onsubmit="someFunction();"

আপনার someFunction()আপনি (AJAX সঙ্গে বা না হোক) যা চাও না, এবং শেষ, আপনি যোগ return false;ফর্মটি জমা দিতে না ব্রাউজার বলতে ...


4
এটি করার একটি মায়াবী উপায় আছে। একটি লক্ষ্য বৈশিষ্ট্য সেট করুন যাতে ফর্মটি বর্তমান ফ্রেম ব্যতীত অন্য কোথাও পুনঃনির্দেশ করে। আপনি যদি আপনার পৃষ্ঠাগুলিতে এই জাতীয় জিনিসের জন্য একটি অদৃশ্য iframe যোগ করেন। এটা বেশ সহজ।
ইসা চানজী

5

এটি করতে আপনার অ্যাজাক্স দরকার। এটার মতো কিছু:

$(document).ready(function(){
    $("#myform").on('submit', function(){
        var name = $("#name").val();
        var email = $("#email").val();
        var password = $("#password").val();
        var contact = $("#contact").val();

        var dataString = 'name1=' + name + '&email1=' + email + '&password1=' + password + '&contact1=' + contact;
        if(name=='' || email=='' || password=='' || contact=='')
        {
            alert("Please fill in all fields");
        }
        else
        {
            // Ajax code to submit form.
            $.ajax({
                type: "POST",
                url: "ajaxsubmit.php",
                data: dataString,
                cache: false,
                success: function(result){
                    alert(result);
                }
           });
        }
        return false;
    });
});

4
আপনি এই উত্স কোডটি ইন্ডেন্ট না করার কোনও বিশেষ কারণ আছে কি? সি আবিষ্কার হওয়ার আগে ষাটের দশকের কোড দেখে মনে হচ্ছে। আমি ভেবেছিলাম আমরা দীর্ঘ সময় ধরে এটি শেষ করেছি।
Alfe

3

২০২০ সালের হিসাবে ওয়ান-লাইনারের সমাধান, যদি আপনার ডেটাটি এই হিসাবে প্রেরণ করা multipart/form-dataনা হয় application/x-www-form-urlencoded:

<form onsubmit='return false'>
    <!-- ... -->           
</form>

4
যদি আপনি এটি অপের সাথে সংযুক্ত করেন action="...", এটি কার্যকরভাবে পৃষ্ঠা স্যুইচটিকে বাধা দেয়, তবে পুরো নেটওয়ার্ক জুড়ে ডেটা জমা দেওয়াও প্রতিরোধ করে।
কেভ

@ কেভ আমি ব্যক্তিগতভাবে জেএস এক্সএইচআর এর মাধ্যমে আমার ডেটা প্রেরণ করি, এজন্য আমি পৃষ্ঠা পুনঃনির্দেশ চাই না, কারণ এটি কোনও জেএস অ্যাপ্লিকেশন
আলেকজান্দ্রে ডাব্রিকোর্ট

@ কেভ দুঃখিত, আমার এটি উল্লেখ করা উচিত ছিল
আলেকজান্দ্রি ডাব্রিকোর্ট

2

JQuery এর postফাংশন দেখুন।

আমি একটি বোতাম তৈরি করব এবং একটি onClickListener( $('#button').on('click', function(){});) সেট করে ফাংশনে ডেটা প্রেরণ করব।

এছাড়াও, preventDefaultjQuery এর ফাংশনটি দেখুন !


1

এখানে বর্ণিত হিসাবে ফর্মের বাইরে জমা বোতামটি সরিয়েও কাঙ্ক্ষিত প্রভাব অর্জন করা যেতে পারে:

পৃষ্ঠা পুনরায় লোড প্রতিরোধ এবং ফর্ম পুনঃনির্দেশ আজাজ / jquery জমা

এটার মত:

<form id="getPatientsForm">
    Enter URL for patient server
    <br/><br/>
    <input name="forwardToUrl" type="hidden" value="/WEB-INF/jsp/patient/patientList.jsp" />
    <input name="patientRootUrl" size="100"></input>
    <br/><br/>
</form>

<button onclick="javascript:postGetPatientsForm();">Connect to Server</button>

1

এই স্নিপেট ব্যবহার করে, আপনি ফর্মটি জমা দিতে এবং পুনঃনির্দেশ এড়াতে পারেন। পরিবর্তে আপনি আর্গুমেন্ট হিসাবে সাফল্য ফাংশনটি পাস করতে পারেন এবং যা চান তা করতে পারেন।

function submitForm(form, successFn){
    if (form.getAttribute("id") != '' || form.getAttribute("id") != null){
        var id = form.getAttribute("id");
    } else {
        console.log("Form id attribute was not set; the form cannot be serialized");
    }

    $.ajax({
        type: form.method,
        url: form.action,
        data: $(id).serializeArray(),
        dataType: "json",
        success: successFn,
        //error: errorFn(data)
    });
}

এবং তারপরে ঠিক করুন:

var formElement = document.getElementById("yourForm");
submitForm(formElement, function() {
    console.log("Form submitted");
});

0

আপনি যদি পিছনের প্রান্তটি নিয়ন্ত্রণ করেন তবে তার response.redirectপরিবর্তে এর মতো কিছু ব্যবহার করুন response.send

আপনি এর জন্য কাস্টম এইচটিএমএল পৃষ্ঠাগুলি তৈরি করতে পারেন বা আপনার ইতিমধ্যে কিছুতে পুনর্নির্দেশ করতে পারেন।

এক্সপ্রেস.জেজেসে:

const handler = (req, res) => {
  const { body } = req
  handleResponse(body)
  .then(data => {
    console.log(data)
    res.redirect('https://yoursite.com/ok.html')
  })
  .catch(err => {
    console.log(err)
    res.redirect('https://yoursite.com/err.html')
  })
}
...
app.post('/endpoint', handler)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.